为什么Knockout.js的默认相等比较器将非原始类型视为不相等?

时间:2012-10-03 18:40:30

标签: knockout.js

从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;
    }
};

这对我来说似乎不直观,但必须有一些理由让史蒂夫桑德森不顾一切地定义这个。为什么会这样呢?它似乎不必要地触发更改通知。

2 个答案:

答案 0 :(得分:4)

这样做是因为如果你有一个包含对象的observable,Knockout不知道子属性是否被更改。

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

答案 1 :(得分:2)

如果你有一个observable,它持有一个对象,你可以创建一个自定义equalityComparer,根据你的需要返回相等。只需在要自定义的可观察实例上设置该属性即可。签名是:

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

现在,当函数返回false时,你的observable只会引发change-event。