11

从 Knockout v2.1.0 调试源代码:

ko.observable['fn'] = {
    "equalityComparer": function valuesArePrimitiveAndEqual(a, b) {
        var oldValueIsPrimitive = (a === null) || (typeof(a) in primitiveTypes);
        return oldValueIsPrimitive ? (a === b) : false;
    }
};

这对我来说似乎不直观,但史蒂夫·桑德森(Steve Sanderson)不遗余力地定义这一点肯定是有原因的。为什么会这样?它似乎不必要地触发了更改通知。

4

2 回答 2

4

这样做是因为如果您有一个包含对象的可观察对象,则 Knockout 不知道子属性是否已更改。

此时,我们会触发通知,以防对象的某个属性发生变化。

于 2012-10-03T19:24:29.937 回答
2

如果您有一个持有对象的可观察对象,您可以制作一个自定义的equalComparer,以根据您的需要返回相等性。只需在要自定义的可观察实例上设置属性。签名是:

myObservable["equalityComparer"] = function(a, b){ 
  return a===b;// Or any arbitrary comparison
};

现在,当函数返回 false 时,您的 observable 只会引发更改事件。

于 2017-10-05T10:36:44.547 回答