2012-10-03 5 views
10

z kodu źródłowego debug Knockout V2.1.0:Dlaczego domyślny porównywalnik równości Knockout.js traktuje typy nieprymitywne jako nie równe?

ko.observable['fn'] = { 
    "equalityComparer": function valuesArePrimitiveAndEqual(a, b) { 
     var oldValueIsPrimitive = (a === null) || (typeof(a) in primitiveTypes); 
     return oldValueIsPrimitive ? (a === b) : false; 
    } 
}; 

Wydaje nieintuicyjne do mnie, ale musi być jakiś powód, Steve Sanderson wyszedł z jego sposobem na określenie tego. Dlaczego tak się stało? Wydaje się niepotrzebnie wywoływać powiadomienia o zmianach.

+0

świetne pytanie! Może po prostu nie rozumiem wystarczająco dużo KO, ale w jaki sposób powyższy kod wyzwala zmianę powiadomień? –

Odpowiedz

4

Stało się tak, ponieważ jeśli masz obiekt obserwowalny, który trzyma obiekt, Knockout nie wie, czy właściwości podrzędne zostały zmienione, czy nie.

W tym momencie wywołujemy powiadomienie, na wypadek gdyby zmieniła się jedna z właściwości obiektu.

+0

Czy nie pomogłoby to tylko w przypadku, gdyby obserwowalne zostało ustawione ponownie z tą samą wartością? Na przykład. jeśli masz 'var obj = {name: 'David'}; var x = ko.observable (obj); 'Następnie mówisz:' obj.name = 'Bob'; 'które nie wywoła powiadomienia, tylko wtedy, gdy wywołasz' x (obj) ;, po czym powiadomi o zmianie poprawny? – Davy8

+0

Dobrze, zgadza się. Możesz również wywołać 'x.valueHasMutated()' –

+3

To wydaje się dość ograniczonym przypadkiem użycia dla mnie, a dla mnie jest to nieoczekiwane zachowanie, że musiałem zajrzeć do kodu źródłowego, aby to zrozumieć. Czy był to problem, który często pojawiał się przy korzystaniu z KO? Wygląda na to, że normalne sprawdzenie równości spowodowałoby problemy tylko dla ludzi, którzy nie rozumieją, jak działa równość obiektów. – Davy8

0

Jeśli masz obiekt obserwowalny, który trzyma obiekt, możesz utworzyć niestandardowy equalityComparer, aby zwrócić równość w zależności od potrzeb. Po prostu ustaw właściwość na obserwowalnej instancji, którą chcesz dostosować. Podpis to:

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

Teraz Twoje obserwowalne tylko wywołuje zmianę zdarzenia, gdy funkcja zwraca false.

Powiązane problemy