在breeze / knockout中创建新实体,避免重复重新定义模型

时间:2013-09-10 11:13:49

标签: knockout.js breeze

关于此问题有几个问题,但它们(我发现的)都没有得到完全解答/解决。

所以在经典的asp.net中我会有一个模型/类来表示我正在尝试创建的数据库表 - 比如说是一个新客户。在我的.net视图/页面中,我有一个“添加新”按钮,这将清除所有客户字段(姓名,地址,电话号码,电子邮件,网站等)并允许用户输入。当用户填写字段并点击“添加>”时按钮,我将验证条目,然后调用“添加客户”例程,传入我想要创建的新客户记录/实体。为了方便起见,我有了“添加客户”方法,将客户对象作为参数,并使用我已经在我的实体/ linq模型中拥有的客户类来实现这一目标。

所有死的简单,香草,“创造新的”功能。

所以在微风/淘汰赛中,我很难看到如何做到这一点,而没有惊人的重新定义/重复。如果我有一个“newcustomer.html”视图和匹配的“newcustomer.js”视图模型,那么我如何将空白或空客户实体暴露给“value:”绑定到表单字段?我可以愉快地读取数据库并通过“data-bind:text ...”类型方法在表单字段中显示返回的客户实体,但在创建新客户时,我想要一个空白的客户实体,而不是从数据库读。

所以我知道Ward提出的一个建议是有一个我验证的项目视图模型,然后传递给后台“创建实体”breeze方法,如果它通过验证但是这是我的感觉,我必须重新定义/重复视图模型中的所有现有模型字段以实现它。当然,我需要一整套可观察量:

var customerName = ko.observable('');
var customerAddress1 = ko.observable('');
var customerAddress2 = ko.observable('');
var customerTown = ko.observable('');
etc...

由于我已经有效地在我的项目中定义了相同的模型/类,为什么这是一种有效或可接受的方法来解决这个问题?有没有办法让“newcustomer”视图绑定到现有breeze实体模型的实例?如果数据库发生变化,那么维护很糟糕,因为我需要手动编辑所有项目视图模型才能匹配!

当然,我可能会在这里忽略这一点......

编辑: 在进一步阅读时,看起来可能创建一个分离的实体并将其绑定到挖空形式可能是一种前进的方式。似乎我想要的方法类似于这个问题中提到的方法:creating/updating breeze entities with one-to-one relationship但令人沮丧的是,提问者关于分离的实体是否>的问题。绑定>编辑字段>将分离的实体添加到经理> savechanges是推荐的工作流程是无人接听的。

由于沃德本人正在参与这个问题,并没有对这个建议感到不满,也许没关系?再次,令人沮丧的是,我注意到Ward很困惑为什么OP创建分离的实体,这似乎是一个完全正确的方法来做这件事。在我看来,如果用户决定不提交保存,那么在附加状态下创建实体将导致必须删除它。或者我混淆了并且“附加”实际上并没有在那时创建实体,并且直到管理者发生“保存更改”才会发生这种情况?

1 个答案:

答案 0 :(得分:0)

我从未使用过Breeze所以我不确定这是否适用于您的问题,但是如果我有一个viewModel,它会被视图使用但会异步获取数据,我通常会这样解决:

var CustomerModel = function (data) {
    this.name = ko.observable('');
    this.address1 = ko.observable('');
    this.address2 = ko.observable('');
    this.town = ko.observable('');

    this.init(data);
};

CustomerModel.prototype = {
    init: function (data) {
        if (!data) return;
        this.name(data.name);
        this.address1(data.address1);
        this.address2(data.address2);
        this.town(data.town);       
    }
}

var ViewModel = function () {
    var self = this;
    this.customerModel = new CustomerModel();
    this.getData = function() {
        dataservice.getData()
            .done(function(result) {
                self.customerModel.init(result);
            });
    };
};

var vmInstance = new ViewModel();

ko.applyBindings(vmInstance);

vmInstance.getData();

我在这里做了一个小提琴示例:http://jsfiddle.net/danne567/9E9Yk/6/