【问题标题】:Disable removal of items禁用删除项目
【发布时间】:2013-05-08 09:03:05
【问题描述】:

我正在使用映射插件从事件溯源事件中更新数组

this.itemMapping = {
    key: function (item) {
        return ko.utils.unwrapObservable(item.id);
    },
    create: function () {
        return new ItemViewModel();
    },
    update: function (options) {
        return options.target.update(options.data);            
    }
};

问题是事件一次出现,但我希望数组能够反映所有事件。剔除映射的默认行为是删除数据中未找到的项目,我可以禁用它吗?

显示问题的小提琴

http://jsfiddle.net/TJ3fv/

【问题讨论】:

  • 简短回答:不。您不能禁用它,您已经编写了自己的合并逻辑。已删除的项目不会转移到newContents 数组see in source。但你知道这是开源的,所以你只需要 fork 和修复它。
  • 我查了源,在删除的情况下为时已晚,原来的项目被删除了,所以找不到它的索引等重新插入它。想找个更好的地方拦截,但是代码实在是太难看懂了(updateViewmodel这个方法几百行太长了)
  • 你可以让它以肮脏的方式工作......jsfiddle.net/MCs6f
  • 不行,逻辑严重依赖比较新传入的数组(漏掉了item)

标签: knockout.js knockout-mapping-plugin


【解决方案1】:

遇到了同样的问题。我发现创建第二个 observableArray 并通过订阅更新它要容易得多。

function(){
    ko.mapping.fromJS({
        last_events: []     
    }, {}, this);

    events = ko.observableArray()

    this.last_events.subscribe(function(items){
        for(var i=0; i < items.length; i++){
            events.push(items[i])
        }
    })
}

【讨论】:

  • 这有什么帮助?如果相同的域实体被更新两次,那么您将拥有重复项。您的解决方案没有考虑合并
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-08
  • 1970-01-01
相关资源
最近更新 更多