1

我正在尝试学习foreach绑定,但我不明白为什么$(element).fadeIn(500)下面代码中的行不起作用:

ko.applyBindings({
        myItems: ko.observableArray([ 'A', 'B', 'C' ]),
        FadeIn: function(element, index, item) {
          if(element.nodeType == 1){
            $(element).fadeIn(500);
          }
        },
        addItem: function() { this.myItems.push('New item'); }
    });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>

<ul data-bind="foreach: { data: myItems, afterAdd: FadeIn }">
    <li data-bind="text: $data"></li>
</ul>
 
<button data-bind="click: addItem">Add</button>

问题是当我添加一个新项目时,它出现在页面中而没有淡入效果。

Codepen -> https://codepen.io/anon/pen/ejxeBr

4

1 回答 1

2

这是因为您的元素没有隐藏。将其更改为

$(element).hide().fadeIn(500);
// --------^^^^^^^

...或style="display: none"在标记中设置它,但这可能会因为预先存在的元素(不会被afterAdd调用)而感到痛苦。

例子:

var count = 0;
ko.applyBindings({
  myItems: ko.observableArray(['A', 'B', 'C']),
  FadeIn: function(element, index, item) {
    if (element.nodeType == 1) {
      $(element).hide().fadeIn(500);
    }
  },
  addItem: function() {
    this.myItems.push('New item');
  }
});
<ul data-bind="foreach: { data: myItems, afterAdd: FadeIn }">
  <li data-bind="text: $data"></li>
</ul>

<button data-bind="click: addItem">Add</button>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>

于 2018-08-11T16:01:52.077 回答