在使用ko.viewmodel插件时,如何删除由“extend”选项添加的knockout observable

时间:2013-07-26 16:09:58

标签: knockout.js

使用ko.viewmodel插件时,如何在取消映射时删除使用extend选项添加的observable?

给出这个例子:

var model = { name: "test", location: "someplace", items : ["apple","orange"] }

var viewmodel = ko.viewmodel.fromModel(model, {

  extend: {

    "{root}": function(stuff){
        stuff.selectedItem = ko.observable("apple");
    },

    "{root}.items[i]": function(item){
        item.sayHello = function(){
            alert("hello!");
        }
    }

  }

});

var output = ko.viewmodel.toModel(viewmodel);

输出对象包含我不想要的“selectedItem”属性。使用ko.viewmodel时如何排除此扩展属性?我想依赖插件的默认映射来模拟模型中的每个其他属性(在另一种情况下,模型可能更复杂) - 我只需要在viewmodel中有这个额外的observable。

1 个答案:

答案 0 :(得分:0)

我找到了我需要做的事情。您可以传递一个包含“map”和“unmap”属性的对象,而不是为每个“扩展”规则定义一个函数,以定义所需的额外映射和取消映射(但仍然使用其他所有内容的默认映射)。在取消映射期间,您可以手动删除额外属性,以便在调用ko.viewmodel.toModel时不会出现。

所以在我的例子中我需要使用:

var viewmodel = ko.viewmodel.fromModel(model, {

   extend: {
      "{root}": {
          map: function(stuff){
             stuff.selectedItem = ko.observable("apple");
             return stuff;
          },
          unmap: function(stuff){
             delete stuff.selectedItem
             return stuff;
          }
      },

      "{root}.items[i]": function(item){
          item.sayHello = function(){
             alert("hello!");
          }
      }

   }

});