3

たくさんのko.observable、ko.observableArray、およびこれらのオブザーバブルをさらに含むネストされたオブジェクトを含む複雑なモデルがあります。

もともと私は、Jsonデータを取得し、そのオブザーバブルにデータを入力するために、構成でより大きなモデルを構成する各モデル内でメソッドを作成する必要がありました。今私はko.mappingプラグインを試しましたが、それを使用すると:

ko.mapping.fromJS(jsonData, {}, existingModel);

これはほとんどのオブジェクトで機能するように見えますが、これを行うと、オブジェクトが完全に上書きされるように見えることに気付きました。ノックアウトjs検証を使用しているため、次のようになります。

this.Name = ko.observable().extend({ required: true });
this.Age = ko.observable().extend({ required: true, digits: true });

問題は、マッピングモジュールを使用すると、これらの検証属性が削除されたように見えることです。そのため、オブジェクトスキーマを改ざんするのではなく、マッピングプラグインに値を更新させる方法があります...

モデルにJsonデータを適用するためのより良い方法があれば、ko.mapping以外の別のメカニズムを使用できてうれしいです。

4

3 に答える 3

2

http://knockoutjs.com/documentation/plugins-mapping.htmlから(セクション高度な使用法

マッピングの実行方法をより細かく制御する必要がある場合があります。これは、マッピングオプションを使用して実現されます。これらは、ko.mapping.fromJS呼び出し中に指定できます。以降の呼び出しでは、それらを再度指定する必要はありません。

したがって、たとえば、次のようなことを試すことができます。

var self = this;
var mapping = {
    update: function(arg) {
        var data = arg.data;

        return {
            Name: data.Name && self.Name(data.Name),
            Age: data.Age && self.Age(data.Age)
        }
    }
};
ko.mapping.fromJS(data, mapping);
于 2012-06-04T14:17:11.670 に答える
2

以下の簡単なプラグインを作成することで、既存のフィールドに入力するために作成されたコードの量を大幅に削減できましたが、最終的には自分のアプローチに固執する必要がありました。

https://github.com/grofit/knockout.mapping.merge

これは非常に単純で、同じ名前のオブジェクトを既存のフィールドに一致させる以外にはほとんど何もしません。子オブジェクトの作成を管理して、オブジェクトツリー全体にデータを入力できるようにしたいと思っていましたが、残念ながら時間がなくなりました。

うまくいけば、モデルを更新するために多くの詳細なコードを記述しなくても、少なくとも可能な解決策が示されるでしょう。

于 2013-04-15T15:34:21.010 に答える
0

ニーズがそれほど大きくない場合は、単純なバニラJSforループを使用してこれを行うことができます。この例では、「myViewModel」という既存のモデルと、「jsonData」という部分更新のデータがあることを前提としています。

for (var prop in jsonData) {
    if (myViewModel.hasOwnProperty(prop)) {
        myViewModel[prop](jsonData[prop]);
     }
}

値を更新するだけなので、オブザーバブルにアタッチした追加の属性はそのままにしておく必要があります。

于 2014-03-25T17:09:44.923 に答える