KnockoutJS模板'beforeRemove'被调用三次而不是1次

时间:2011-10-05 14:19:20

标签: javascript knockout.js

我的KnockoutJS模板如下所示:

       <div id="wrapper" data-bind="template: {
                                                name:'theTemplate', 
                                                foreach: cars(),  

                                                beforeRemove: function(elem) { 
                                                    console.log(elem);                                     
                                                    console.log('try removing..');
                                                    try {
                                                        jQuery(elem).hide().remove();
                                                    } catch (e) {
                                                        console.log(e);
                                                    }
                                                },

                                                afterAdd: function(elem) { 
                                                    console.log('try adding..');
                                                    try {
                                                        jQuery(elem).hide().fadeIn();
                                                    } catch (e) {
                                                        console.log(e);
                                                    }
                                                }
                                            }"></div>

当我从cars()observableArray中删除一个对象时,我想隐藏()并删除()要删除的元素。除了删除元素之外,beforeRemove函数被调用三次,其中三个不同的元素作为参数。

这三个要素是:

  1. Comment { data=" Block 1 ", length=9, nodeName="#comment", meer...} 尝试删除..

  2. <TextNode textContent=" "> 尝试删除..

  3. <div class="block"> 尝试删除..

  4. afterAdd的行为方式相同..这是一个错误,还是我对该函数的理解不正确?

    谢谢你的时间!

1 个答案:

答案 0 :(得分:2)

如果您的模板包含这些元素,我相信这是预期的行为。

如果您只想隐藏/显示特定元素 - 例如,&lt; div&gt;元素 - 你想要做一个jQuery选择器来过滤元素:

afterAdd: function(elem) { 
    console.log('try adding..');
    try {
        jQuery(elem).filter("div").hide().fadeIn();
    } catch (e) {
        console.log(e);
    }
}

相关:我不建议在HTML中放置大的javascript函数。它混乱了HTML并混淆了视图和视图逻辑的关注。我会做这样的事情:

<div id="wrapper" data-bind="template: {
    name:'theTemplate', 
    foreach: cars,
    beforeRemove: onRemovingCar,
    afterAdd: onAddedCar
}"></div>

<script type="text/javascript">

  var viewModel = {
     onRemovingCar: function(element) { 
          console.log(element);                                     
          console.log('try removing..');
          try {
              jQuery(element).hide().remove();
          } catch (e) {
              console.log(e);
          }
      },
      onAddedCar: function(element) { 
          console.log('try adding..');
          try {
              jQuery(element).hide().fadeIn();
          } catch (e) {
              console.log(e);
          }
      }
  };

</script>