如何将计算的observable的值导入observableArray()?

时间:2014-03-31 12:19:35

标签: knockout.js

我正在尝试计算一些值并将它们绑定到UI以及observableArray()。问题是我真的不知道该怎么做。我曾尝试使用此代码,但没有成功。这是 kodg 是我用来构建root到api动作的参数,必须返回所需的值,而 books 是绑定到UI的observableArray()。

function GrafikViewModel(grafikUri) {
        var self = this;
        self.kodg = ko.observable();
        //Getting parameter
        var kod = self.kodg();
        //Passing parameter to api
        var paxuri = '/api/orders/GetPax/' + kod;
        self.getPax = ko.computed(function () {
            $.getJSON(paxuri, function (data) {
                self.getPax(data);
            });
        });
        //How include computed values into array?
        self.books = ko.observableArray(); 
        $.getJSON(grafikUri, function (data) {
            self.books(data.$values);
        });
    }

这是必须包含计算值的HTML。

<td>
<input type="text" id="left" class="form form-control" data-bind="value: $data.getPax" /></td>

更新即可。好的,我找到了一些允许获得计算值的解决方案,但是这个值仍然没有绑定到UI。

function GrafikViewModel(grafikUri) {
            var self = this;
            self.books = ko.observableArray();
            self.PaxLeft = ko.computed(function() {
                ko.utils.arrayForEach(self.books(), function(book) {
                    $.ajax({
                        url: '/api/orders/getpax/' + book.kodg,
                        dataType: 'application/json; charset=utf-8',
                        success: function (msg) {
                            return msg.d;
                        }
                    });
                }, GrafikViewModel)});
            $.getJSON(grafikUri, function (data) {
                self.books(data.$values);
            });
        }

msg.d 应该是通过self.PaxLeft绑定到UI的计算值,但事实并非如此。

1 个答案:

答案 0 :(得分:0)

  

如何将计算值包含到数组中?

要在observableArray中包含一个计算器,我只需从另一个viewmodel构建一个数组。然后,您可以将ko.computed函数添加到该视图模型。像这样:

var GrafikViewModel = function(data) {
    var self = this;
    self.Books = ko.observableArray(
        ko.utils.arrayMap(data.books, function (item) {
            return new BooksViewModel(item);
        }));
};

var BooksViewModel = function(data){
    var self = this;    
    self.MyComputed = ko.computed(function(){
        // do something
    });
};