ビューモデルが手動またはマッピングプラグインを使用して自動的に定義されている場合、プロトタイプを使用してコードの後半でビューモデルを「拡張」(プロパティ/関数を追加)する問題はありますか?
マッピングプラグインの作成コールバックを知っていますが、代わりにプロトタイプを使用することの影響があるかどうかを知りたいだけですか?私が尋ねている理由は、サーバー側のコードからビューモデルの大部分を生成しているためですが、最初の生成よりも後でビューモデルを拡張する必要がある場合があります。
ビューモデルが手動またはマッピングプラグインを使用して自動的に定義されている場合、プロトタイプを使用してコードの後半でビューモデルを「拡張」(プロパティ/関数を追加)する問題はありますか?
マッピングプラグインの作成コールバックを知っていますが、代わりにプロトタイプを使用することの影響があるかどうかを知りたいだけですか?私が尋ねている理由は、サーバー側のコードからビューモデルの大部分を生成しているためですが、最初の生成よりも後でビューモデルを拡張する必要がある場合があります。
これには問題はないと思います。対応する構造化されたJSONからマッピングプラグインを介してインスタンス化された大きなディープビューモデルグラフを使用し、プロトタイプを使用して、有用なプロパティとtoJSONの「オーバーライド」を備えた「AbstractViewModel」を定義します。もの。
これで問題ありません。viewModelの特定のフィールドにデータがない場合に、ビューが適切に応答することを確認してください。
これにはいくつかの方法があるようです。
1つは、単一のオブジェクトビューモデルを取得し、プロトタイプを介してutils.extendすることができます。
ko.utils.extend(ViewModelClass.prototype, {
newPrototype1: function () { ... },
newPrototype2: function () { ... }
}
または、エクステンダーを追加してノックアウトし、監視可能なオブジェクト自体を介して呼び出すことができます:(http://knockoutjs.com/documentation/extenders.html)
ko.extenders.numeric = function(target, precision) {
...details in link above...
}
...
self.NumericProperty = ko.observable(data).extend({ numeric: 0 });
...
または、observable、observableArray、計算されたすべてのインスタンスで使用できる関数を作成します...(http://knockoutjs.com/documentations/fn.html)
ko.observable.fn.filterByProperty = function(propName, matchValue) {
return ko.computed(function() {
...details in link above...
}, this);
}
私はこれらの組み合わせを使用する傾向があります。ビューモデルのプロトタイプをVMやマッピングとは別のファイルに拡張するのが好きなので、次のような構造になっています。
ご覧のとおり、これらの「回答」間の期間はかなり長いため、変更されたものもあれば、同じままのものもあります。