Почему сопоставитель равенства по умолчанию 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.