Knockoutjs with mapping.fromJS和template

时间:2013-01-20 11:20:31

标签: javascript jquery knockout.js knockout-mapping-plugin

我的模型中的每个条目都更新了一个表,并且在删除和添加到数组时触发了两个事件。 hideElement调用jquery“fadeOut”,showElement调用jquery“fadeIn”函数来创建漂亮的淡出/淡入效果。

<tbody  data-bind='template: { foreach: entries,
     beforeRemove: hideElement,
     afterAdd: showElement }'>

我的模型是这样的:

var Model = function() {
self.entries = ko.mapping.fromJS([]);
this.getData = function() {
$.ajax({
    url: "/test",
    type: "GET",
    success: function(response) {
        ko.mapping.fromJS(response, self.entries);
...

this.showElement = function(elem) { 
    if(elem.nodeName == "TR") {
         $(elem).fadeIn(500);
    }
};

this.hideElement = function(elem) { 
    if(elem.nodeName == "TR") {
       $(elem).fadeOut(500);
    };
};
...

问题在于每次在ajax响应中调用ko.mapping.fromJS(response, self.entries)时,看起来淘汰都会删除/添加条目,即使它们完全相同。因此,调用showElement / hideElement并且我的表中的元素“闪烁”,因为它们被删除/添加每个ajax调用。

它是假设是这样还是我使用它错了?

1 个答案:

答案 0 :(得分:2)

您需要使用映射插件中的密钥选项,以便插件知道哪些项目是相同的

http://jsfiddle.net/yWwfz/

var mapping =  {
    items: {
        key: function(item) { return item.id; }
    }
};
ko.mapping.fromJS(data, mapping, this);
相关问题