从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;
}
};
这对我来说似乎不直观,但必须有一些理由让史蒂夫桑德森不顾一切地定义这个。为什么会这样呢?它似乎不必要地触发更改通知。
答案 0 :(得分:4)
这样做是因为如果你有一个包含对象的observable,Knockout不知道子属性是否被更改。
此时,我们会触发通知,以防其中一个对象的属性发生变化。
答案 1 :(得分:2)
如果你有一个observable,它持有一个对象,你可以创建一个自定义equalityComparer,根据你的需要返回相等。只需在要自定义的可观察实例上设置该属性即可。签名是:
myObservable["equalityComparer"] = function(a, b){
return a===b;// Or any arbitrary comparison
};
现在,当函数返回false时,你的observable只会引发change-event。