Аргумент подписки любого нокаута obervable следует вызывать только при изменении значения.
Это не совсем так, согласно сопровождающим нокаута.
Knockout использует equalityComparer
, чтобы определить, отличается ли новое значение от старого:
console.log(
ko.observable.fn.equalityComparer
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-debug.js"></script>
Как видите, на самом деле он ===
только делает, если значения примитивны.Любые другие значения, такие как объекты, массивы и функции, просто всегда вызывают изменение.
Я обычно "исправляю" это, перезаписывая значение по умолчанию:
const someObj = {};
const someObs = ko.observable(someObj);
someObs.subscribe(console.log);
// Logs {}
console.log("with regular eq comparer");
someObs(someObj);
// Change equalityComparer for *every* observable:
ko.observable.fn.equalityComparer = (a, b) => a === b;
// No longer logs:
console.log("with custom eq comparer");
someObs(someObj);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
Если вы не хотите перезаписывать все равенство равенства, вы также можете изменить его только на одном наблюдаемом экземпляре.
ПричиныПо умолчанию многие люди ожидают, что это вызовет обновления: (чего не происходит, когда вы используете мой пользовательский компаратор)
const someObj = { a: 1 };
const someObs = ko.observable(someObj);
someObj.a = 2;
someObs(someObj)