2013-02-25 17 views
13

Con il codice sottostante, l'input # p_in verrà aggiornato con il cambio di input # s_in. Ma ho usato cleanNode (sec). Qualcuno potrebbe aiutare a capire perché l'associazione non è stata chiarita.È possibile utilizzare cleanNode() per pulire l'associazione?

<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> 

risposta

29

ko.cleanNode viene utilizzato internamente da Knockout per ripulire i dati/i calcoli creati in relazione all'elemento. Non rimuove alcun gestore di eventi aggiunto dai binding o capisce necessariamente se un binding ha apportato modifiche al DOM. Questo può sicuramente causare problemi come avere più gestori collegati ad un elemento quando viene successivamente rilegato.

Quindi, non mi consiglia di utilizzare questo modello. Un modello migliore è quello di utilizzare with o il collegamento template attorno a una sezione e consentirne il ri-rendering con i nuovi collegamenti.

+0

cleanNode è davvero un'API interna. Al momento non ci sono documenti specifici. –

+14

@RPNiemeyer potresti elaborare come la parola chiave "with" potrebbe risolvere questo problema? Mi trovo in una situazione simile e una finestra sub-modale è aperta/chiusa e ho bisogno di evitare di chiamare i bind di applicazione più volte. –

+1

L'unico caso di utilizzo legittimo che ho trovato è quando collaudo i collegamenti o i componenti. La mia funzione afterEach pulisce l'elemento contenente l'impostazione di test per l'associazione, quindi esegue cleanNode su di esso per far sì che KO lo dimentichi. Quindi posso iniziare il prossimo prima di ogni altro, impostando di nuovo l'associazione per il test. In questo modo ho test completamente incapsulati. –

1

Got ammettere, sono un po 'confuso, in quanto works for me! Cosa stai vedendo e cosa ti aspetti di vedere esattamente?

Tale codice mostrerà due ingressi con lo value p, che è quello che mi aspetterei.

+0

Grazie per la risposta. Originariamente, mi aspetterei che cleanNode ripulirà completamente tutti i dati relativi agli attacchi (inclusi i gestori di eventi) in modo che possa passare facilmente l'associazione di un elemento tra viewModels. In effetti, volevo utilizzare una casella di controllo per controllare il passaggio di due modelli di visuale legati a un elemento. – rxing

+0

Stavo vedendo è che dopo aver modificato l'input # s_in, verrà aggiornato anche il valore dell'input # p_in. Questo non è quello che mi aspetterei all'inizio. – rxing

Problemi correlati