2012-01-12 64 views
10

我在获取KnockoutJs beforeRemove和afterAdd处理程序后触发了一些问题。触发beforeRemove,在KnockoutJS中添加处理程序之后

这是相关的代码片段

function viewModel(list) { 
    var self = this; 

    this.items = ko.observableArray(list); 

    this.removeItem = function(item) { 
     self.items.remove(item); 
    } 

    this.removeFirst = function() { 
     self.removeItem(self.items()[0]); 
    }; 

    this.onRemove = function(elements) { 
     console.log("Updating"); 
     $(elements).addClass('transition-out'); 
    }; 
} 

ko.applyBindings(new viewModel(items)); 

而这种标记

<button data-bind="click: removeFirst">Remove first</button> 
<ul data-bind='foreach: items, beforeRemove: onRemove'> 
    <li data-bind="text: name, click: $parent.removeItem"></li> 
</ul> 

我看到名单的更新,但onRemove处理程序从来没有发射。

我创建了JSFiddle来说明问题。

感谢,

基因

回答

27

要使用的语法如下:

data-bind='foreach: { data: items, beforeRemove: onRemove }' 

beforeRemove是由foreach(并最终template)结合所接受的选项。它被视为一种单独的绑定方式,你指定它的方式。如果一个绑定不存在,那么它将被忽略(某些绑定可以通过allBindingsAccessor访问,所以KO不会知道这一点,也不会引发错误)。

此外,该函数将为您的“模板”中的每个节点调用一次。在你的情况下,它将是一个文本节点,li,和另一个文本节点。如果要忽略文本节点,请检查元素的(第一个参数)nodeType是否为1.

+0

谢谢!我错过了'beforeRemove'的范围应该是'foreach'的值;理所当然! – 2012-01-13 00:05:29

+0

它看起来并不像这样,甚至在knockoutjs实况教程页面上对动画转换进行了解释。我很高兴我找到了这个答案!谢谢尼迈耶。 – ClearCloud8 2012-10-04 21:47:15

相关问题