Come forzare un aggiornamento della vista senza attivarlo automaticamente da un osservabile?


151

Nota: questo è principalmente per il debug e la comprensione di KnockoutJS.

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

ko.refreshView();

Capisco che questo non è un uso previsto di Knockout, ma voglio ancora sapere se esiste un metodo simile per scopi di debug e apprendimento.

Risposte:


252

Non è possibile chiamare qualcosa sull'intero ViewModel, ma su un singolo osservabile è possibile chiamare myObservable.valueHasMutated()per notificare agli abbonati che devono rivalutare. Questo non è generalmente necessario in KO, come hai detto.


5
È inoltre possibile scorrere il contesto dei dati, cercando elementi con una valueHasMutatedproprietà di tipo functione chiamandolo per ciascuno di essi. Ciò dovrebbe ottenere tutti i tuoi dati osservabili, ma è una cattiva pratica e concepibilmente innescare molti più aggiornamenti di quanto tu preveda (pensa alle catene di dipendenza calcolate).
Patrick M,

Sarebbe sicuramente bello se non altro: test in Chrome.
Scott Romack,

Il tuo viewModel può, di per sé, essere osservabile, quindi puoi chiamare myViewModel.valueHasMutated()per aggiornare l'intera vista.
Roy J,

2
Non funziona neanche su array qui. In effetti, gli array non sembrano funzionare affatto in Knockout. Mi manca Angular :-(
garryp,

2
Funziona su KnockoutObservableArrays a partire da KO 3.5
balint

25

In alcune circostanze potrebbe essere utile rimuovere semplicemente gli attacchi e quindi riapplicare:

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

Grazie per l'editing ebram ... Immagino che avrei dovuto menzionare che uso coffeescript ;-)
ProfNimrod

15
Fai attenzione se usi anche jQuery (ad es. Durante la migrazione di bit dell'app a ko) poiché cleanNode rimuoverà anche altri eventi dom.
Dan Revell,

Questo è perfetto. Non riesco a far riconoscere a KO i NUOVI bambini dom con attributi di associazione dei dati dopo l'applicazione di un modello di visualizzazione.
Andrew T Finnell,

Perfetto! Lavorando!
jeff_drumgod

0

Ho creato un JSFiddle con il mio gestore di knockout bindHTML qui: https://jsfiddle.net/glaivier/9859uq8t/

Innanzitutto, salva il gestore dell'associazione nel suo file (o in un comune) e includilo dopo Knockout.

Se usi questo cambia i tuoi attacchi a questo:

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

OR

<!-- ko bindHTML: htmlValue --><!-- /ko -->
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.