Knockout afterAdd函数未在预加载的项目上触发

时间:2014-05-03 00:36:18

标签: knockout.js

当使用带有'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>

1 个答案:

答案 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');

或者,您可以使用afterRenderdocs here):

  每次foreach块被复制并插入到文档中时都会调用afterRender - 在foreach首次初始化时以及稍后将新条目添加到关联数组时。 Knockout将为您的回调提供以下参数:

     
      
  • 插入的DOM元素数组
  •   
  • 绑定它们的数据项
  •