2012-09-07 13 views
7

In pratica voglio riapplicare i binding sulla stessa pagina per i diversi oggetti, ma c'è un comportamento strano. Dopo aver riapplicato il binding, l'elenco degli elementi è stato perso.Riapplicare i binding in knockout

Si prega di consultare qui: http://jsfiddle.net/baio/9UcUs/5/

Cosa fare?

+0

Questo potrebbe non rispondere a una domanda direttamente, ma un approccio più standard con knockout è quello di associare il modello di vista e quindi modificare i contenuti del modello piuttosto che modificare l'intero modello ogni volta. Vedi http://jsfiddle.net/9UcUs/8/ per un esempio. –

+0

Il codice pertinente dovrebbe sempre essere *** *** nella domanda, non solo collegato (nemmeno jsFiddle). –

risposta

6

La risposta breve è che non è supportato. La lunga risposta è che ci sono alcuni modi per aggirarla. Un modo è chiamare cleanNode prima del applyBindings, ma questo non cancella i gestori di eventi. Un altro modo è quello di avvolgere il tuo modello di vista in un osservabile e quindi aggiornare quello osservabile per riapplicare i collegamenti; questo funziona molto meglio, ma ha ancora un piccolo problema (vedi sotto).

Ecco il vostro esempio utilizzando il metodo osservabile vista del modello: http://jsfiddle.net/mbest/9UcUs/9/

L'unico problema che ho trovato con l'utilizzo di una vista del modello osservabile è che i gestori di eventi non sono completamente aggiornati con il nuovo modello di vista. Chiameranno la funzione corretta nel nuovo modello di vista, ma i valori this e data saranno per il modello di visualizzazione originale.

Modifica:

Knockout 3.0 (attualmente previsto in uscita questo mese) supporta pienamente modelli vista osservabili. Potrebbero esserci ancora problemi con i binding personalizzati, ma speriamo che tutto questo verrà presto documentato.

4

è possibile associare lo stesso modello di visualizzazione a diversi elementi, è necessario specificare l'elemento a cui si desidera applicare il binding.

ko.applyBindings(vm, $('#yourul')); 

ko.applyBindings(vm, $('#div')); 
+6

ricorda che Knockout non dipende da jQuery: usa '$ ('# yourul') [0]' e '$ ('# div') [0]' –

0

fare:

ko.applyBindings(viewModel, $('#somejQObj')[0]); 

Opere come indicato nei commenti di @ di fengd risposta. Attualmente dispone di una tabella popolata da un'istruzione foreach, che dispone di righe espandibili che ognuna ha una tabella secondaria aggiunta dinamicamente, anch'essa popolata da un'istruzione foreach. Dopo ogni sotto-tabella viene inserita dinamicamente facendo il precedente imposta i binding per la sotto-tabella e popola i dati.

Problemi correlati