Yapabileceğiniz en iyi şey, bir özel kullanmaktır Test edilmedi bağlayıcı. Özel bağlayıcınızı foreach
sonra data-bind
bağlama listesinde yerleştirebilir veya kodunuzu yürütülmeden önce içerik oluşturmak için foreach
izin vermek için kodunuzu bir setTimeout
içinde yürütebilirsiniz. İşte
kodu tek çalışma süresi ve kodu her zaman çalışan gösterir bir örnek olduğunu da observableArray güncellemeler:
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);
Neden onlar DOM'ye oluşturulur zaman bilmek gerekir? Stil uygularsanız, CSS yalnızca kural ile eşleşmeli ve öğeler eklendikçe uygulanmalıdır. – arb