我最近有一个类似的问题,我即兴创作了一点。
如果要效仿你的例子,我首先检索所有客户并将它们存储到一个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]));
}
然后,我没有绑定到原始客户,而是绑定到扩展客户。
计算为我提供了基于客户实体创建更多属性的功能,然后如果此添加的属性之一已更改,则修改客户实体。(阅读如何使用计算来读取和写入值。)
我选择这样做是因为我只需要在我的一个视图模型中使用这些扩展对象。如果您在多个视图模型中需要它们,您可以将这些扩展对象的范围限定在上层,以便您的视图模型通用。
如果您需要将其范围限定为多个视图模型,您还可以按照 John Papa 课程中的示例,通过将 DTO 映射到实体来为客户实体添加属性。如果您想在不同的虚拟机中访问它,这样对您来说会更容易。唯一的缺点是,如果您需要添加大量属性(或解决外键),如果您按照 John Papa 的示例,您将在数据服务上拥有很多功能。您应该将其移动到中介对象中。