当使用带有'afterAdd'函数返回的foreach绑定时,我遇到了敲除问题。基本上,它在最初调用ko.applyBindings时不会触发 - 如果项目随后被添加到它工作的foreach数据中。
这是一个简单的小提示来证明这个问题: http://jsfiddle.net/sWa3F/1/
<ul data-bind="foreach: {data: items, afterAdd: function(a,b,c) { $(a).css('color', 'red'); }}">
<li data-bind="text: $data"></li>
</ul>
<script type="text/javascript">
var vm = {
items: ko.observableArray(['A', 'B', 'C'])
};
ko.applyBindings(vm);
vm.items.push('D');
</script>
答案 0 :(得分:1)
名称很清楚... afterAdd
在添加元素后发生。因此,如果它们在绑定之前存在,则afterAdd
不会被调用。这应该是显而易见的。
那么,为什么不首先绑定模型,然后将项目添加到您的可观察数组中,即
var vm = {
items: ko.observableArray()
};
ko.applyBindings(vm);
// preload items after binding:
vm.items(['A', 'B', 'C']); // afterAdd will be called!!
vm.items.push('D');
或者,您可以使用afterRender
(docs here):
每次foreach块被复制并插入到文档中时都会调用afterRender - 在foreach首次初始化时以及稍后将新条目添加到关联数组时。 Knockout将为您的回调提供以下参数:
- 插入的DOM元素数组
- 绑定它们的数据项