Почему сопоставитель равенства по умолчанию 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;
}
};
Это кажется мне неинтуитивным, но почему-то Стив Сэндерсон не знал, что это значит. Почему это так? Кажется, что это необязательно вызывает уведомления об изменениях.
Ответы
Ответ 1
Это было сделано, потому что если у вас есть наблюдаемое, которое содержит объект, Knockout не знает, были ли изменены под-свойства или нет.
В этот момент мы вызываем уведомление только в том случае, если одно из свойств объекта изменилось.
Ответ 2
Если у вас есть наблюдаемый объект, который удерживает объект, вы можете создать пользовательский метод равенства, чтобы вернуть равенство в соответствии с вашими потребностями. Просто установите свойство на наблюдаемом экземпляре, который вы хотите настроить. Подпись:
myObservable["equalityComparer"] = function(a, b){
return a===b;// Or any arbitrary comparison
};
Теперь ваш наблюдаемый вызывает только событие change-event, когда функция возвращает false.