当函数更新在计算中使用的可观察数组时,knockout computed数组不会更新

时间:2013-12-28 23:15:25

标签: knockout.js

我有以下计算的observable女巫基本上将modelViewModels observableArray分成另一个数组来代表行(虽然逻辑不是问题)

这是在构造函数

中定义的
self.selectModelRows = ko.computed(function () {
    alert("computing");
    var result = [],
        row,
        colLength = parseInt(self.selectModelRowCount(), 10);

    for (var i = 0, j = self.modelViewModels.length; i < j; i++) {
        if (i % colLength === 0) {
            if (row) {
                result.push(row);
            }
            row = [];
        }
        row.push(self.modelViewModels()[i]);
    }

    if (row) {
        result.push(row);
    }
    return result
});

我把警报放在那里进行调试。 警报在构造函数运行时第一次发生 但是我有以下函数来更新计算

中使用的modelViewModels
self.getModels = function () {
    alert("getting");
    var self = this;
    self.modelViewModels([]);

    $.when(self.dataContext.getAvailableModels(self.selectedSeriesOption()))
        .done(function (data) {
            ko.utils.arrayForEach(data.Models, function (item) {
                var modelViewModel = new ModelViewModel();
                modelViewModel.Model = item.ModelNumber;
                   //more logic will be added
                self.modelViewModels.push(modelViewModel);
            });
        })
        .fail(function (message) {
            alert("failed");
        });
}

当调用该函数时,我看到"getting"警报,但未再次调用计算函数,"computing"警报从未发生,并且控制台中没有错误。

不确定在调用getModels函数后我还需要做些什么才能使计算更新。

1 个答案:

答案 0 :(得分:2)

在计算函数内部,for循环不会被调用,因为你的数组长度错误。

self.modelViewModels.length将始终评估为0。因此,for内的任何内容都不会执行,因此您不会读取任何observable对象,从而导致 无依赖 要求那个计算的函数。

将您的代码更改为self.modelViewModels().length。只需添加()

即可