Sto provando a scrivere i miei modelli KO in un determinato modo e sembra che causi problemi con Knockout, che interrompe l'aggiornamento della vista. Vorrei evitare troppe dipendenze esplicite nel mio punto di vista il più possibile, in modo che quando sto scrivendo un modello per l'aggiunta a un elenco di file allegati, ho pensato che avrei potuto fare uso della variabile $data
:
<script id="attachments-template" type="text/html">
<input type="button" data-bind="attachments: $data" value="add">
</script>
E il modello vincolante:
Ciò mantiene la proprietà effettiva mappata nel sito di utilizzo, anziché in modelli casuali. Il gestore di binding attachments
nel mio caso reale racchiude il plugin jQuery fileupload, ma solo chiamando lo push(i++)
mostra comunque il problema.
var i = 0;
ko.bindingHandlers.attachments = {
init: function(element, valueAccessor) {
var files = valueAccessor();
$(element).click(function() {
files.push(i++);
});
}
};
var list = ko.observableArray();
var model= {
attachments: list
};
un violino che mostra questo, utilizzando KO 2.2.0: http://jsfiddle.net/stofte/sWGkJ/ il violino mostra anche che il legame contro una proprietà esplicita funziona bene.
Ovviamente ci sono molte cose su Google e SO su KO e contesti vincolanti, ma non riesco a trovare nulla sull'uso dei dati $ nei gestori di binding, non sono sicuro di quale legge KO sto rompendo con il mio utilizzo di $ data, ma sembra che sarebbe logico poter fare ciò che voglio?
Sembra che tu abbia appena spostato il problema nella tua VM. Dovrei apportare questa modifica ai miei modelli con varie liste e, peggio, tutto il mio codice esistente che funziona su questi elenchi. Non penso che sia meglio. – Svend
Ciao Svend, hai ragione. Ho rivisto la mia risposta per dare una soluzione simile, ma forse più elegante. Questo potrebbe effettivamente essere un bug con il comportamento previsto di knockout - ma poi di nuovo, ci può essere una ragione per cui si comporta in questo modo. Forse una domanda per Steve Sanderson? –