2013-04-01 16 views
8

Sto tentando di associare un ko.observableArray di stringhe a un modello, ma non riesco a ottenere il modello per rilevare le modifiche nelle stringhe all'interno della matrice.Come posso associare un ko.observableArray di stringhe?

Se eseguo il binding di un set di oggetti anziché un set di stringhe, ottengo aggiornamenti sul JSON, ma non attivano nulla finché non cambio effettivamente il primo valore non array. Preferirei trovare una serie di stringhe, tuttavia, poiché potrò postare il modello di dati direttamente sul server senza alcuna elaborazione successiva.

Come posso attivare gli aggiornamenti delle matrici di stringhe e come posso garantire che attivino correttamente le modifiche senza dover aggiornare un valore di non matrice?

Se non è possibile eseguire il binding a un array di stringhe osservabili, come posso attivare gli eventi durante l'aggiornamento degli oggetti all'interno dell'array osservabile?

vedere l'esempio qui: http://jsfiddle.net/gcEHC/2/

In questo esempio, i dati di array3 si rifletterà nel modello quando il valore viene modificato, ma i cambiamenti di Array1 ei dati di matrice2 sarà mai vedere.

JS:

var ViewModel = function() { 
    this.value = ko.observable("hi") 
    this.array1 = ko.observableArray(["hi", "there"]); 
    this.array2 = ko.observableArray([ko.observable("hi"), ko.observable("there")]); 
    this.array3 = ko.observableArray([{ data: "hi" }, { data: "there" }]); 
}; 

ko.applyBindings(new ViewModel()); 

HTML:

<div class='liveExample'> 
    <p><input data-bind='value: value' /></p> 
    <div data-bind="foreach: array1"> 
     <p><input data-bind='value: $data' /></p> 
    </div> 
    <div data-bind="foreach: array2"> 
     <p><input data-bind='value: $data' /></p> 
    </div> 
    <div data-bind="foreach: array3"> 
     <p><input data-bind='value: data' /></p> 
    </div> 
</div> 

<pre data-bind="text: ko.toJSON($data)"></pre> 

risposta

5

Dal docs:

Semplicemente mettendo un oggetto in un observableArray non rende tutti proprietà dell'oggetto stessi osservabile . Ovviamente, è possibile impostare se si desidera, ma è una scelta indipendente . Un osservableArray semplicemente tiene traccia degli oggetti che possiede e notifica agli ascoltatori quando gli oggetti vengono aggiunti o rimossi.

È necessario creare un oggetto che abbia una proprietà osservabile (della stringa). Quindi crea un array osservabile di quegli oggetti.

Per esempio, ecco un esempio che aggiorna la proprietà di un oggetto 2 secondi dopo l'applicazione degli attacchi:

var item = function(text) { 
    var self = this; 

    self.Name = ko.observable(text); 
} 

var vm = { 
    items: ko.observableArray([ 
     new item('one'), 
     new item('two'), 
     new item('three') 
     ]) 
} 

ko.applyBindings(vm); 
setTimeout(function() { 
    vm.items()[1].Name('updated!'); 
}, 2000); 

Ecco un, campione eseguibile completo: http://jsfiddle.net/psteele/z6gbM/

+0

quando ho creato un array osservabile di stringhe osservabili, non funziona ancora. Vedi array2 nel jsfiddle collegato sopra. Nota che le modifiche all'array osservabile di stringhe non vengono mai rilevate, indipendentemente dal fatto che il contenuto sia osservabile o meno. – slipheed

+0

Vedere la mia risposta aggiornata con codice di esempio. – PatrickSteele

+0

Ciao Patrick, grazie per il tuo codice aggiornato - ma la domanda è davvero perché non funziona: 'this.array2 = ko.observableArray ([ko.observable (" hi "), ko.observable (" there ")]); '. Nulla nella documentazione suggerisce che non dovrebbe funzionare. – slipheed

9

In KO 3, se si puntare a $ rawData nel bind, l'esempio dell'array2 funziona come previsto.

+1

Grazie, ho dimenticato $ rawData; ha avuto lo stesso problema, ora funziona se si passa direttamente all'array una stringa osservabile. –

Problemi correlati