2

ノックアウトからプロパティを削除する方法を考えています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つのオブジェクトが表示されます。1つは計算された観測量を削除する前で、もう1つは計算された観測量を削除した後です。

于 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 に答える