16

私は次のモデルを持っています:

var model = {
   A: 'One',
   B: 'Two',
   C: 'Three'
};

さまざまな UI 要素をこれらのフィールドにバインドすると、うまく機能します。ただし、変更をサーバーに保存できるように、モデルを JavaScript オブジェクトに戻します。

var goingToServer = ko.toJS(model);

goingToServerプロパティ A、B、および C が含まれます。ただし、プロパティ C は決して変更されないデータの巨大なチャンクであるとしましょう。これをサーバーに送り返すのは避けたいです。

モデルを JavaScript オブジェクトに変換するときに、事前定義された一連のフィールドtoJS() のみを含める方法はありますか?

私が調査していることの 1 つは、ノックアウト マッピング プラグインです。includeと呼ばれる設定があり、次のように文書化されています。

ビュー モデルを JS オブジェクトに戻す場合、デフォルトでは、マッピング プラグインには元のビュー モデルの一部であったプロパティのみが含まれます。ただし、元のオブジェクトの一部ではなくても、Knockout によって生成された _destroy プロパティも含まれます。 . ただし、この配列をカスタマイズすることを選択できます。

ただし、このプラグインは文書化されているようには機能しないようko.mapping.toJS()ですinclude。. この機能は、元のモデルにはなかった追加のフィールド['A', 'B']を含めることを意図していると思います。

オブジェクトを生成し、サーバーに送信する前に不要なプロパティを手動で削除するなどのハックなことをする以外に、モデルを JavaScript オブジェクトに変換するときに特定のプロパティを除外する方法はありますか?

4

3 に答える 3

28

ignoreキーワードを試しましたか?インクルードと同様の使用法があります。

var mapping = {
    'ignore': ["propertyToIgnore", "alsoIgnoreThis"]
}
var viewModel = ko.mapping.toJS(data, mapping);

サーバーデータの元のマッピングを行うときにignoreを使用するだけで、JSに変換して戻すときにオブジェクトにまったく表示されなくなります。

于 2013-02-20T19:30:31.383 に答える
3

vm.Payment オブザーバブル参照の下に複雑なオブジェクト モデル インスタンスがあるとします。

{
    "Summary": { 
        "Count": 12,
        "PaymentAmount": 1500,
        "PaymentMethod": "Cheque",
        "PaymentDate": "2015-04-08T22:38:48.552Z",
        "AgentOid": 1208795,
        "AgentName": "Asere Ware"
    }
    //[...]
}

一部の内部プロパティのみを無視する必要がある場合:

var mapping = {
    'ignore': ['Summary.PaymentMethod', 'Summary.PaymentDate'] //avoid lost some initialized values.
};
// map updating existing observable (Payment) under my ViewMode (vm) with source "data" JSON object.
ko.mapping.fromJS(data, mapping, vm.Payment);

これは vm.Payment コンテンツの結果であり、PaymentMethod と PaymentDate のみが保持されます。

{
    "Summary": { 
        "Count": 0,
        "PaymentAmount": 0,
        "PaymentMethod": "Cheque",
        "PaymentDate": "2015-04-08T22:38:48.552Z",
        "AgentOid": undefined,
        "AgentName": undefined
    }
    //[...]
}

于 2015-04-08T23:02:08.703 に答える
2

わかりました、より良いアプローチがあることを望んでいますが、うまくいく解決策を見つけました。秘訣は、マッピング プラグインでこれらのフィールドを無視し、計算フィールドとして手動で追加することです。が呼び出されたときに、計算されたフィールドが生成された JavaScript オブジェクトに含まれることはありませんtoJS

// Utility function to quickly generate a computed field
ko.readonly = function (value)
{
   return ko.computed(function ()
   {
      return value;
   });
};

// View Model
var ViewModel = function (project)
{
   var readonly = ['B', 'C', 'D']; // Fields I want to ignore
   var mapping = {
      'ignore': readonly //Read-only properties, we'll add these manually as computed fields
   };

   // Use Mapping plugin to make everything observable, except the fields above
   ko.mapping.fromJS(project, mapping, this);

   // Now loop through the read only array and add these fields in as computed
   for(var i = 0; i < readonly.length; i++)
   {
      var field = readonly[i];
      this[field] = ko.readonly(project[field]);
   }
}

これらのビュー モデルに通常どおりバインドできるようになりました。

ko.applyBindings(new ViewModel(data));
于 2013-02-20T21:04:59.927 に答える