0

关于这个有几个问题,但没有一个(我发现)已经完全回答/解决了。

因此,在经典的 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”视图绑定到现有微风实体模型的实例?如果数据库发生更改,这将很难维护,因为我需要手动编辑所有项目视图模型以匹配!

当然,我可能在这里非常错过重点......

编辑:进一步阅读,看起来可能创建一个分离的实体并将其绑定到淘汰赛形式可能是一种前进的方式。看来我想要的方法类似于这个问题中提到的方法:创建/更新具有一对一关系的微风实体,但令人沮丧的是,提问者关于是否分离实体>绑定>编辑字段>添加分离实体的问题manager > savechanges 是一个推荐的工作流程,没有答案。

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

4

1 回答 1

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/

于 2013-09-10T13:30:59.743 回答