我正在使用John Papa的CodeCamper Pluralsight示例作为基础(Durandal框架,这是一个很好的项目开始)。
我有一个客户实体,并希望显示类似于部分的客户列表,您只需检索实体的部分数据。不同之处在于我想检索/显示不属于客户实体的其他字段。示例:1)第2年的总销售额2)客户上次订购的日期。
我想在客户端扩展“customer”的定义并在那里存储这些数据。这样,如果我转到客户详细信息,例如更新客户名称,当我返回客户列表时,将反映更改,因为数据将从本地缓存中检索。
但我还必须确保在保存更改时,这些扩展属性(总销售额和最后订单日期)不会导致问题,因为客户模型中不存在这些问题。
这可能吗?我对DTO有点了解,是不是要走的路?我可以动态添加未在元数据中引用的属性,还是会导致我出现问题?
由于
答案 0 :(得分:0)
我最近遇到过类似的问题而且我有一些即兴创作。
如果要遵循您的示例,我首先会检索所有客户并将其存储到名为observableArray()
的{{1}}。
之后,我编写了一个函数,该函数将客户对象作为参数,并创建一些依赖于客户对象的其他更多属性。因为“我的客户”有一些外键作为属性,我需要这种行为来解决外键。我虽然最简单的方法是使用customers
。 coumputed可以根据客户属性来制作外键。
我的功能看起来像这样:
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()
然后我没有绑定到原始客户,而是绑定了扩展客户。
计算机为我提供了基于客户实体创建更多礼仪的功能,然后如果其中一个添加的属性已被更改,则修改客户实体。(阅读如何使用计算机读取和写入值。)
我选择这样做是因为我只在一个视图模型中需要这些扩展对象。如果您需要在多个视图模型中使用它们,则可以将此扩展对象的范围设置在较高级别,这样您的视图模型就会很常见。
如果您需要将其范围限定为多个视图模型,您还可以按照John Papa的课程中的示例,通过将DTO映射到实体来向客户实体添加礼仪。这样,如果你想在不同的vm中访问它,它会更容易。如果您需要添加大量属性(或解决外键),那么唯一的问题是,如果您遵循John Papa的示例,那么您将在dataservice上拥有许多功能。您应该将其移动到中介对象中。