La cosa migliore è quella di utilizzare un costume rilegatura. Puoi inserire la tua rilegatura personalizzata dopo foreach
nell'elenco di associazioni nel tuo data-bind
oppure puoi eseguire il codice in un setTimeout
per consentire a foreach
di generare il contenuto prima che il codice venga eseguito.
Ecco un esempio che mostra l'esecuzione di codice una sola volta e l'esecuzione di codice ogni volta che gli aggiornamenti observableArray: http://jsfiddle.net/rniemeyer/Ampng/
HTML:
<table data-bind="foreach: items, updateTableOnce: true">
<tr>
<td data-bind="text: id"></td>
<td data-bind="text: name"></td>
</tr>
</table>
<hr/>
<table data-bind="foreach: items, updateTableEachTimeItChanges: true">
<tr>
<td data-bind="text: id"></td>
<td data-bind="text: name"></td>
</tr>
</table>
<button data-bind="click: addItem">Add Item</button>
JS:
var getRandomColor = function() {
return 'rgb(' + (Math.floor(Math.random() * 256)) + ',' + (Math.floor(Math.random() * 256)) + ',' + (Math.floor(Math.random() * 256)) + ')';
};
ko.bindingHandlers.updateTableOnce = {
init: function(element) {
$(element).css("color", getRandomColor());
}
};
//this binding currently takes advantage of the fact that all bindings in a data-bind will be triggered together, so it can use the "foreach" dependencies
ko.bindingHandlers.updateTableEachTimeItChanges = {
update: function(element) {
$(element).css("color", getRandomColor());
}
};
var viewModel = {
items: ko.observableArray([
{ id: 1, name: "one" },
{ id: 1, name: "one" },
{ id: 1, name: "one" }
]),
addItem: function() {
this.items.push({ id: 0, name: "new" });
}
};
ko.applyBindings(viewModel);
fonte
2012-04-19 15:41:26
Perché avete bisogno di sapere quando vengono resi nel DOM? Se stai applicando gli stili, i CSS devono semplicemente corrispondere alla regola e applicare come gli elementi aggiunti. – arb