触发器计算在observableArray元素属性更改时重新计算

时间:2014-04-23 19:26:21

标签: knockout.js

我有observableArray元素(元素不是可观察的,但有些是不可观察的对象)。我还有computed变量,observableArray上的变量。如果我将元素推入数组,那么一切正常(我的意思是 - 计算变量重新计算)。

但是,如果我更改observableArray单项的某些属性,则不会重新计算计算结果:

var myObsArr = ko.observableArray();

// myObsArr is loaded using ko.mapping.fromJS with data from server
// but I am using custom mapping that won't create observables for observableArray items, part of my custom mapping (the one that corresponds to observable item) is something like this:
 create: function (options) {
    // here are some manipulations and
    return ko.toJS(options.data); //doesn't create observables for observableArry items
}

var computedArr = ko.computed(function() {
   var t = self.myObsArr();
   // do manipulations on t and return manipulated array
});

// later I need to change some elements of observable array, for example:
myObsArr[0].Month = "Mar"; //doesn't trigger computed to be recalculated

当可观察数组中的任何对象发生更改时,如何触发计算重新计算?

1 个答案:

答案 0 :(得分:2)

修改其中一个元素后,您可以在valueHasMutated上调用myObsArr方法。它将触发淘汰依赖关系跟踪,并会通知您computedArr有关更改的信息:

myObsArr[0].Month = "Mar";
myObsArr.valueHasMutated();

但是,每次更改数组中的项目时都必须记住调用此项,这样您最好将Month转换为ko.observable,因为在这种情况下,ko更改跟踪将选择自动更改,它将通知您的计算而无需任何其他代码。

相关问题