2013-02-25 14 views
13

Mit dem unteren Code wird die Eingabe # p_in mit der Änderung der Eingabe # s_in aktualisiert. Aber ich habe cleanNode (sec) benutzt. Kann jemand helfen zu verstehen, warum die Bindung nicht geklärt ist?Kann cleanNode() verwendet werden, um die Bindung zu bereinigen?

<input id="p_in" data-bind="value: name"></input> 
    <input id="s_in" data-bind="value: name"></input> 
    <input id="cb" type="checkbox">same</input> 

    <script type="text/javascript"> 
     function AddrDataSet (name) { 
      this.name = ko.observable(name); 
     }; 

     var primary_set = new AddrDataSet('p'); 
     var sec_set = new AddrDataSet('s'); 
     var pri = $('#p_in')[0]; 
     var sec = $('#s_in')[0]; 

     ko.applyBindings(primary_set, pri); 
     ko.applyBindings(sec_set, sec); 

     ko.cleanNode(sec); // clean it 
     ko.applyBindings(primary_set, sec); // bind it to primary_set 
     ko.cleanNode(sec); // clean it again 

    </script> 

Antwort

29

ko.cleanNode wird intern von Knockout verwendet, um Daten/Berechnungen zu bereinigen, die im Zusammenhang mit dem Element erstellt wurden. Es entfernt keine Ereignisbehandlungsroutinen, die durch Bindungen hinzugefügt werden, oder sie verstehen notwendigerweise, ob eine Bindung Änderungen am DOM vorgenommen hat. Dies kann auf jeden Fall zu Problemen führen, wenn mehrere Handler an ein Element angehängt werden, wenn es anschließend erneut gebunden wird.

Also, ich würde nicht empfehlen, dieses Muster zu verwenden. Ein besseres Muster besteht darin, with oder die template Bindung um einen Abschnitt herum zu verwenden und es mit den neuen Bindungen neu zu rendern.

+0

cleanNode ist wirklich eine interne API. Es gibt derzeit keine Dokumente speziell dafür. –

+14

@RPNiemeyer könnten Sie erarbeiten, wie "mit" Schlüsselwort dieses Problem lösen könnte? Ich bin in einer ähnlichen Situation, und ein sub-modales Fenster ist geöffnet/geschlossen und ich muss vermeiden, Bindungen mehrfach zu nennen. –

+1

Der eine legitime Anwendungsfall, den ich gefunden habe, ist, wenn man Bindungen oder Bestandteile prüft. Meine afterEach-Funktion bereinigt das Element, das die Testkonfiguration für die Bindung enthält, und führt cleanNode darauf aus, damit KO es vergisst. Dann kann ich den nächsten vor jedem starten und die Bindung für den Test erneut einrichten. Auf diese Weise habe ich Tests vollständig gekapselt. –

1

muss zugeben, ich bin ein wenig verwirrt, wie es works for me! Was siehst du und was erwartest du genau zu sehen?

Dieser Code zeigt zwei Eingänge mit der value p, was ich erwarten würde.

+0

Danke für die Antwort. Ursprünglich würde ich erwarten, dass cleanNode alle verbindungsbezogenen Daten (einschließlich Ereignisbehandlungsroutinen) vollständig aufräumt, so dass ich die Bindung eines Elements zwischen viewModels einfach umschalten kann. Eigentlich wollte ich ein Kontrollkästchen verwenden, um den Wechsel von zwei Viewmodels zu steuern, die an ein Element gebunden sind. – rxing

+0

Ich sah, dass, nachdem Sie Eingabe # s_in ändern, der Wert der Eingabe # p_in auch aktualisiert wird. Das ist nicht das, was ich am Anfang erwarten würde. – rxing

Verwandte Themen