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.

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.


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

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 -->
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.