Knockout deferUpdates Konflikt mit 'if' Bindung

9

Ich verwende sehr oft die if -Bindung in Knockout, um etwas zu verbergen, mit dem zusätzlichen Bonus, dass ich mich nicht um Nullreferenzfehler in if kümmern muss. In diesem Beispiel, wenn address() null ist, wird der gesamte Block entfernt, so dass Sie vermeiden müssen, dass für jede Eigenschaft eine Nullprüfung durchgeführt wird. Dies wäre nicht der Fall, wenn ich die Bindung visible verwendet hätte.

%Vor%

Dies ist der einfachste Fall oben - und ja, ich würde dieses Muster generell mit der Kommentarsyntax <!-- ko --> verwenden.

Was mich tatsächlich Probleme verursacht, ist, wenn ich einen komplexeren computed -Wert verwende und die Option ko.options.deferUpdates aktiviere:

%Vor%

Die einfachste Implementierung dieses computed Observable könnte in etwa so aussehen:

%Vor%

Das alles funktioniert großartig, bis ich Folgendes mache:

  

1) setze ko.options.deferUpdates = true vor dem Erstellen der Observablen.

     

2) address() beginnt mit null und alles ist in Ordnung

     

3) setze address() auf { street: '123 My Street' } . Wieder funktioniert alles gut.

     

4) setze address() auf null zurück. Ich bekomme einen Nullfehler, weil address().street ist    null :-(

     

Hier ist eine Geige, um das Problem zu veranschaulichen: Ссылка

Leider scheint es aufgrund der Reihenfolge, in der die Mikro-Tasks laufen, die text -Bindung vor der if -Bindung neu zu berechnen und so erhalten Sie immer noch einen Null-Fehler, der normalerweise nicht auftreten würde.

Ich habe ein wenig Angst davor, da ich dieses Muster sehr oft benutze: - (

    
Simon_Weaver 11.04.2017, 09:09
quelle

2 Antworten

3

Bei Verwendung von deferUpdates verwendet Knockout intern ein dirty -Ereignis, um alle berechneten Observablen über eine Änderung ihrer Abhängigkeiten zu benachrichtigen und um Aktualisierungen zu planen, was in der Reihenfolge erster Ordnung geschieht. Das Problem tritt hier auf, weil Bindungen das dirty -Ereignis ignorieren und auf ein change -Ereignis warten, was in der Reihenfolge der Breite nach geschehen wird.

Die Korrektur muss in Knockout erfolgen, damit Bindungen auf die dirty -Ereignisse reagieren. Dies wurde bereits für die kommende Version (3.5.0) eingecheckt: Ссылка

    
Michael Best 19.04.2017, 23:31
quelle
0
___ qstntxt ___

Ich verwende sehr oft die ko.options.deferUpdates -Bindung in Knockout, um etwas zu verbergen, mit dem zusätzlichen Bonus, dass ich mich nicht um Nullreferenzfehler in ko.onError kümmern muss. In diesem Beispiel, wenn window.onerror null ist, wird der gesamte Block entfernt, so dass Sie vermeiden müssen, dass für jede Eigenschaft eine Nullprüfung durchgeführt wird. Dies wäre nicht der Fall, wenn ich die Bindung if verwendet hätte.

%Vor%

Dies ist der einfachste Fall oben - und ja, ich würde dieses Muster generell mit der Kommentarsyntax hasAddress verwenden.

Was mich tatsächlich Probleme verursacht, ist, wenn ich einen komplexeren if -Wert verwende und die Option with aktiviere:

%Vor%

Die einfachste Implementierung dieses if Observable könnte in etwa so aussehen:

%Vor%

Das alles funktioniert großartig, bis ich Folgendes mache:

  

1) setze %code% vor dem Erstellen der Observablen.

     

2) %code% beginnt mit null und alles ist in Ordnung

     

3) setze %code% auf %code% . Wieder funktioniert alles gut.

     

4) setze %code% auf null zurück. Ich bekomme einen Nullfehler, weil %code% ist    null :-(

     

Hier ist eine Geige, um das Problem zu veranschaulichen: Ссылка

Leider scheint es aufgrund der Reihenfolge, in der die Mikro-Tasks laufen, die %code% -Bindung vor der %code% -Bindung neu zu berechnen und so erhalten Sie immer noch einen Null-Fehler, der normalerweise nicht auftreten würde.

Ich habe ein wenig Angst davor, da ich dieses Muster sehr oft benutze: - (

    
___ antwort43341782 ___

Gute Nachrichten - Wenn Sie %code% aktiviert haben und nicht einmal erkannt haben, dass Sie Ihre App beschädigt haben, wird Ihrem Benutzer wahrscheinlich kein Fehler angezeigt, da Fehler von Mikroaufgaben ausgelöst werden %code% oder %code% und die Benutzeroberfläche scheint wiederhergestellt zu werden. Aber wenn Sie wie ich diese Fehler protokollieren, dann ist es schlecht.

Gute Nachrichten - Wenn Sie feststellen können, welche Observablen Sie in einer Bindung %code% verwenden, können Sie Folgendes tun und DeferUpdates deaktivieren und wieder einschalten:

%Vor%

Dies kann zu einer Hilfsfunktion gemacht werden. Es könnte komplexere Probleme geben, wenn die %code% complicated komplexere Abhängigkeiten aufweist. Aber für den einfacheren Fall ist das in Ordnung.

Schlechte Nachrichten - Sie können leider Folgendes nicht tun:

%Vor%

Dies liegt nur daran, dass deferUpdates intern funktioniert (von der Quelle aus).

Ich frage mich immer noch, ob es eine bessere Lösung als diese Hilfsfunktion gibt, oder eine Möglichkeit, die %code% -Bindung neu zu schreiben, um etwas Cleveres in der Bindung zu tun, um diesen Fall zu behandeln.

Bearbeiten: Danke an @Tomalak für die Erwähnung von %code% binding. Ich denke nicht, dass es die komplette Lösung ist, nach der ich suche, aber sie kann sicherlich in Verbindung mit irgendwelchen existierenden %code% -Bindungen (die komplexe Regeln haben) so verwendet werden. Könnte die sicherste Lösung sein, wenn Sie versuchen, eine bestehende App zu durchlaufen.

%Vor%     
___ tag123knockoutjs ___ Knockout.js ist eine Open Source-JavaScript-Bibliothek für dynamische HTML-UIs, die das MVVM-Muster (Model-View-View Model) verwenden. ___ qstnhdr ___ Knockout deferUpdates Konflikt mit 'if' Bindung ___ answer43507747 ___

Bei Verwendung von %code% verwendet Knockout intern ein %code% -Ereignis, um alle berechneten Observablen über eine Änderung ihrer Abhängigkeiten zu benachrichtigen und um Aktualisierungen zu planen, was in der Reihenfolge erster Ordnung geschieht. Das Problem tritt hier auf, weil Bindungen das %code% -Ereignis ignorieren und auf ein %code% -Ereignis warten, was in der Reihenfolge der Breite nach geschehen wird.

Die Korrektur muss in Knockout erfolgen, damit Bindungen auf die %code% -Ereignisse reagieren. Dies wurde bereits für die kommende Version (3.5.0) eingecheckt: Ссылка

    
___
Simon_Weaver 11.04.2017 09:21
quelle

Tags und Links