从knockout viewmodel中删除属性

时间:2013-03-12 18:32:18

标签: javascript knockout.js computed-observable

我只是想知道如何从淘汰赛viewModel中移除一个属性。具体来说,计算一个。我有一个简单的viewModel

function viewModel(){
   var self = this;
   self.name = ko.observable("John");
   self.lastname = ko.observable("Doe");
   self.age = ko.observable("22");
   self.fullName = ko.computed(function(){
      return self.name()  + self.lastname();
   });
   self.fullNameAndAge = ko.computed(function(){
      return self.name()  + self.lastname() + ': ' + self.age();
   });
};

数据将被发送到服务器,但我想从viewModel中排除计算数据。

我认为这样的事情会得到所有的计算数据并删除它,但没有找到类似的东西。

      for (observableKey in viewModel) {
        if (ko.isComputed(viewModel[observableKey]) 
                {
            delete viewModel[observableKey];
        }
    }

3 个答案:

答案 0 :(得分:3)

Knockout可以返回一个常规对象,然后您可以从中删除任何内容。

var plainJs = ko.toJS(viewModel);
delete plainJs.fullName;

记录here

答案 1 :(得分:2)

你可以像这样循环键:

for (var key in obj) {
   if(ko.isComputed(obj[key]))
   {
      delete obj[key];
   }
}

修改

Here is a working fiddle。在小提琴中单击按钮并检查控制台,在那里你可以看到2个对象,第一个是在删除计算的obervables之前,第二个是在删除计算的observables之后。

答案 2 :(得分:0)

我遇到此类问题的首选方法是为JSON调用所需的任何内容创建特定的传输对象。

var userSaveRequest = function(data) {
  var self = this;
  self.name = data.name;
  self.lastname = data.lastname;
  // etc, etc
}

然后,从我的调用代码中获取JSON。

// inside viewModel
self.saveUser = function(){
  var queryData = ko.mapping.toJSON(
    new userSaveRequest(ko.mapping.toJS(self))
  );

  // use querydata in AJAX
}

此外,值得记住Javascript的灵活性。如果需要,您可以动态创建自己设计的对象。

var queryData = ko.mapping.toJSON(
   {
     name: self.name(),
     lastname: self.lastname()
   }
);