Como forçar uma atualização de exibição sem que ela seja acionada automaticamente de um observável?

151

Nota: isso é principalmente para depuração e entendimento do KnockoutJS.

Existe uma maneira de solicitar explicitamente ao Knockout que atualize a visualização do modelo de visualização (já vinculado)? Estou procurando algo como:

ko.refreshView();

Entendo que esse não é o uso pretendido do Knockout, mas ainda quero saber se existe um método desse tipo para fins de depuração e aprendizado.

THX-1138
fonte

Respostas:

252

Você não pode chamar algo em todo o viewModel, mas em um observável individual, você pode ligar myObservable.valueHasMutated()para notificar os assinantes que eles devem reavaliar. Isso geralmente não é necessário no KO, como você mencionou.

RP Niemeyer
fonte
5
Você também pode iterar no contexto de dados, procurando elementos que possuam uma valueHasMutatedpropriedade do tipo functione chamando-a para cada um deles. Isso deve receber todos os seus observáveis, mas é uma prática ruim e, provavelmente, gera muito mais atualizações do que você imagina (pense em cadeias de dependência calculadas).
227 Patrick M
Com certeza seria bom se por nada mais - testar no chrome.
Scott Romack
Seu viewModel pode, por si só, ser um observável, para que você possa ligar myViewModel.valueHasMutated()para atualizar a exibição inteira.
Roy J
2
Também não funciona em matrizes aqui. De fato, as matrizes parecem não funcionar no Knockout. Eu sinto falta do Angular :-(
garryp 16/09
2
Ele faz o trabalho em KnockoutObservableArrays partir de KO 3,5
balint
25

Em algumas circunstâncias, pode ser útil simplesmente remover as ligações e reaplicar:

ko.cleanNode(document.getElementById(element_id))
ko.applyBindings(viewModel, document.getElementById(element_id))
ProfNimrod
fonte
Obrigado pela edição ebram ... Acho que eu deveria ter mencionado que eu uso CoffeeScript ;-)
ProfNimrod
15
Cuidado se você também usar o jQuery (por exemplo, ao migrar bits do aplicativo para o ko), pois o cleanNode também removerá outros eventos dom.
Dan Revell 03/03
Isto é perfeito. Não consigo fazer com que o KO reconheça NOV filhos filhos com atributos de ligação de dados depois que um viewmodel foi aplicado.
Andrew T Finnell
Perfeito! Trabalhando!
jeff_drumgod 01/04
0

Eu criei um JSFiddle com meu manipulador de ligação de knockout em HTML aqui: https://jsfiddle.net/glaivier/9859uq8t/

Primeiro, salve o manipulador de ligação em seu próprio arquivo (ou em um arquivo comum) e inclua após Knockout.

Se você usar essa opção, suas associações a isso:

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

OR

<!-- ko bindHTML: htmlValue --><!-- /ko -->
James 'Fofo' Burton
fonte