2011-12-16 6 views
139

Nota: questo è principalmente per il debug e la comprensione di KnockoutJS.Come forzare un aggiornamento della vista senza che si attivi automaticamente da un osservabile?

Esiste un modo per richiedere esplicitamente a Knockout di aggiornare la vista dal modello di visualizzazione (già associato)? Sto cercando qualcosa di simile:

ko.refreshView(); 

Capisco che questo non è un destinazione d'uso a tappeto, ma ho ancora voglia di sapere se v'è un tale metodo per scopi di debug e di apprendimento.

risposta

234

Non è possibile chiamare qualcosa sull'intero viewModel, ma su un singolo osservabile è possibile chiamare myObservable.valueHasMutated() per comunicare agli abbonati che devono essere rivalutati. Questo in genere non è necessario in KO, come hai detto.

+5

È inoltre possibile iterare il contesto dati, alla ricerca di elementi che hanno una proprietà 'valueHasMutated' che è di tipo' function' e chiamandolo per ognuno di loro. Ciò dovrebbe ottenere tutti i tuoi osservabili, ma è una cattiva pratica e, in teoria, licenziare un numero molto maggiore di aggiornamenti di quanto tu non pensi (pensate alle catene di dipendenza calcolate). –

+0

Sarebbe sicuramente bello se non altro: test in chrome. –

+9

Funziona anche sugli array? Nel mio caso no –

23

In alcune circostanze potrebbe essere utile è sufficiente rimuovere le associazioni e poi riapplicare: handler

ko.cleanNode(document.getElementById(element_id)) 
ko.applyBindings(viewModel, document.getElementById(element_id)) 
+0

Grazie per l'ebram di modifica ... Indovino che avrei dovuto accennare che uso coffeescript ;-) – ProfNimrod

+15

Fai attenzione se usi anche jQuery (ad esempio quando migri i bit dell'app a ko) come cleanNode sarà anche rimuovere altri eventi dom. –

+0

Questo è perfetto. Non riesco a convincere KO a riconoscere NUOVI figli dom con gli attributi data-bind dopo l'applicazione di un viewmodel. –

0

ho creato un JSFiddle con i miei bindHTML Knockout vincolante qui: https://jsfiddle.net/glaivier/9859uq8t/

In primo luogo, salva il gestore di binding nel proprio file (o comune) e includi dopo Knockout.

Se si utilizza questa opzione le associazioni a questo:

<div data-bind="bindHTML: htmlValue"></div> 

OR 

<!-- ko bindHTML: htmlValue --><!-- /ko --> 
Problemi correlati