đặt cược tốt nhất của bạn này là sử dụng một tùy chỉnh ràng buộc. Bạn có thể đặt liên kết tùy chỉnh của mình sau foreach
trong danh sách các liên kết trong số data-bind
hoặc bạn có thể thực thi mã của mình trong một setTimeout
để cho phép foreach
tạo nội dung trước khi mã của bạn được thực thi.
Đây là một mẫu cho thấy chạy mã một lần duy nhất và chạy mã mỗi khi cập nhật observableArray của bạn: 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);
Nguồn
2012-04-19 15:41:26
Tại sao bạn cần phải biết khi nào họ được trả lại vào DOM? Nếu bạn đang áp dụng kiểu, CSS sẽ chỉ khớp với quy tắc và áp dụng khi các mục được thêm vào. – arb