【问题标题】:Creating new entities in breeze/knockout and avoiding repetitive redefinition of models在微风/淘汰赛中创建新实体并避免重复重新定义模型
【发布时间】:2013-09-10 11:13:49
【问题描述】:

关于这方面有一些问题,但没有一个(我发现)得到完全回答/解决。

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

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

因此,在微风/淘汰赛中,我正在努力寻找在没有大量重新定义/重复的情况下做到这一点的方法。如果我有一个“newcustomer.html”视图和一个匹配的“newcustomer.js”视图模型,那么如何将空白或空客户实体公开给“值:”绑定到表单字段?我可以愉快地阅读数据库并通过“数据绑定:文本...”类型的方法在表单字段中显示返回的客户实体,但是在创建新客户时,我想要一个空白客户实体,而不是从数据库读取。

所以我知道 Ward 提出的一个建议是拥有一个我验证的项目视图模型,然后如果它通过验证,则传递给后台“创建实体”微风方法,但这是我的看法是我必须这样做重新定义/重复视图模型中的所有现有模型字段以实现它。当然,我需要一个完整的可观察对象列表:

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

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

当然,我可能会严重忽略这里的重点......

编辑: 进一步阅读,看起来可能创建一个分离的实体并将其绑定到淘汰赛形式可能是一种前进的方式。看来我想要的方法类似于这个问题中提到的方法:creating/updating breeze entities with one-to-one relationship 但是,令人沮丧的是,提问者关于分离实体 > 绑定 > 编辑字段 > 将分离实体添加到管理器 > savechanges 是否是推荐的工作流程的问题没有得到解答.

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

【问题讨论】:

    标签: knockout.js breeze


    【解决方案1】:

    我从未使用过 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/

    【讨论】:

    • 谢谢您-但这几乎是我试图避免的情况,因为模型(您正在使用 customermodel 有效地重新创建)已经作为实体定义存在于 Breeze 的 EF 代码中链接到。在我看来,当 Breeze 无论如何都可以轻松获取元数据时,必须分别维护模型的两个版本,这不是一个有效的选择。
    • 好的,感谢您的澄清。我想你必须等待微风忍者来帮助你:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    • 2015-08-19
    • 2013-07-29
    • 1970-01-01
    • 2023-04-03
    • 2014-04-11
    • 1970-01-01
    相关资源
    最近更新 更多