0

我使用 John Papa 的 CodeCamper Pluralsight 示例作为基础(Durandal 框架,这是一个很好的入门项目)。
我有一个客户实体,并希望显示类似于部分的客户列表,您只需在其中检索实体的部分数据。不同之处在于我想检索/显示不属于客户实体的其他字段。示例:1) 当年的总销售额 2) 客户最后一次订购的日期。

我想在客户端扩展“客户”的定义并将这些数据存储在那里。这样,如果我转到客户详细信息,例如更新客户名称,当我返回客户列表时,更改将反映,因为数据将从本地缓存中检索。

但我还必须确保当我保存更改时,这些扩展属性(总销售额和最后订单日期)不会导致问题,因为它们不存在于客户模型中。

这可能吗?我对DTO有点了解,这是要走的路吗?我可以动态添加元数据中未引用的属性,还是会导致我出现问题?

谢谢

4

1 回答 1

0

我最近有一个类似的问题,我即兴创作了一点。

如果要效仿你的例子,我首先检索所有客户并将它们存储到一个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 的示例,您将在数据服务上拥有很多功能。您应该将其移动到中介对象中。

于 2013-10-16T15:09:39.583 回答