私は最近同様の問題を抱えていたので、少し即興で作りました。
あなたの例に従うなら、私は最初にすべての顧客を取得し、それらを という名前の に保存しましobservableArray()
たcustomers
。
その後、顧客オブジェクトをパラメーターとして取り、顧客オブジェクトに依存するその他のプロパティを作成する関数を作成しました。「私の顧客」は属性としていくつかの外部キーを持っていたため、外部キーを解決するためにこの動作が必要でした。それを達成する最も簡単な方法は、を使用することだと思いますko.computed
。計算されたものは、顧客属性に基づいて外部キーを解決できます。
私の関数は次のようになります。
function ExtendedCustomer(customerValue) {
var self = {};
self.customer = customerValue;
self.department= ko.computed(function() {
read: function(){
return getString(self.customer.Department()).StringValue();
},
write: function(newValue){
var newString = createString(newValue);
self.customer.Department(newString.StringID());
}
});
self.description= ko.computed(function() {
read: function(){
return getString(self.customer.Description()).StringValue();
},
write: function(newValue){
var newString = createString(newValue);
self.customer.Description(newString.StringID());
}
});
...
return self;
}
この関数は、顧客とその他のプロパティを含むオブジェクトを返します。取得したすべての顧客に対してこの関数を呼び出し、別の場所に保存しますobservableArray()
。
var helper = ko.observableArray()
for (var i = 0; i < customers().length; i++) {
helper.push(ExtendedCustomer(customers()[i]));
}
次に、元の顧客にバインドする代わりに、拡張された顧客にバインドしていました。
計算されたものは、顧客エンティティに基づいていくつかのプロパティを作成し、この追加されたプロパティのいずれかが変更された場合に顧客エンティティを変更する機能を提供してくれました。
私がこれを選択したのは、これらの拡張オブジェクトが私のビューモデルの 1 つだけに必要だったからです。複数のビューモデルでそれらが必要な場合は、この拡張オブジェクトを上位レベルでスコープして、ビューモデルに共通にすることができます。
複数のビューモデルにスコープする必要がある場合は、John Papa のコースの例に従って、DTO をエンティティにマッピングすることで顧客エンティティにプロパティを追加することもできます。このようにすると、別の vm でアクセスしたい場合に簡単になります。唯一の欠点は、多くのプロパティを追加する (または外部キーを解決する) 必要がある場合、John Papa の例に従えば、データサービスに多くの機能が必要になることです。これをメディエータ オブジェクトに移動する必要があります。