2

我只是想知道如何从 knockout 中删除一个属性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];
        }
    }
4

3 回答 3

3

Knockout 可以返回一个常规对象,然后您可以从中删除任何您想要的东西。

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

记录在这里

于 2013-03-12T18:39:26.130 回答
2

您可以像这样遍历键:

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

编辑

这是一个工作小提琴。在小提琴中单击按钮并检查控制台,您可以看到 2 个对象,第一个是在删除计算的 obervables 之前,第二个是在删除计算的 observables 之后。

于 2013-03-12T18:37:47.910 回答
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()
   }
);
于 2013-03-12T18:53:19.590 回答