2012-12-25 18 views
5

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?

risposta

1

Sembra che a eliminazione diretta non ci si aspetti ansiosamente di passare un observableArray nel parametro data su un collegamento di modello. Di solito è quello che è un foreach. Sembra che data si aspetta che un oggetto normale si comporti correttamente (la citazione è necessaria, non è stato possibile trovare documenti diversi dal fatto che sembra comportarsi in questo modo).

Utilizzando lo stesso codice JS che avete, la soluzione più semplice sembra che sarebbe di avvolgere la matrice osservabile direttamente nel modello di legame:

<script id="button-add-data" type="text/html"> 
    isObservable: <span data-bind="text: ko.isObservable(items)"></span><br> 
    toJSON: <span data-bind="text: ko.toJSON(items)"></span><br> 
    <input type="button" data-bind="attachments: items" value="doesnt update"> 
</script> 
<div data-bind="template: {name: 'button-add-data', data: { items: attachments }}"></div> 

In alternativa si potrebbe sovrascrivere il modello bindingHandler e creare un nuovo parametro che puoi passare e che semplifica questo comportamento simile. Link: knockoutjs overriding bindinghandlers

+0

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

+0

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? –

Problemi correlati