我似乎无法在堆栈上找到我正在寻找的答案。也许我的情况是错的,但无论如何我都会问这个问题。我有一个表单,有两个目的...创建新用户和查看用户。两者都具有相同的视图模型User
。那么让我们来看看我的viewmodel:
var UserModel = function() {
var self = this;
self.UserId = ko.observable();
self.FirstName = ko.observable();
self.LastName = ko.observable();
self.FirstName.extend({required: true});
return self;
}
所以我的绑定在更高级别配置,我有一个带有名为User
的属性的viewmodel。这个名为User
的属性绑定到我的表单。对于创建新用户的简单方案,我会称之为:
this.User(new UserModel());
注意:this.User
是可观察的,因此是方括号。
这将成功创建一个空白表单的用户模型,并且所有验证都有效。
好的情况是两个!我从API获得了一个完整的对象,我该如何映射它。如果我使用:
this.User(ko.mapping.fromJS(data, {}, UserModel));
验证不起作用。我已经看到了包含create
方法的映射选项,但是如何使用它而不会丢失顶部的功能?!
作为旁注,使其更加复杂:
User.ConfirmEmail
存在于我的viewmodel中,但不存在于服务器上!这是我的下一个障碍。如果我使用create
映射,我知道我可以轻松添加它。
通过使用大量构造函数参数,我可以完成两个任务:
var UserModel = function(id, fname, lname) {
var self = this;
self.UserId = ko.observable(id);
self.FirstName = ko.observable(fname);
self.LastName = ko.observable(lname);
self.FirstName.extend({required: true});
return self;
}
如果我现在使用,new UserModel()
它仍会设置属性,我也可以传递值。它看起来很糟糕:(
答案 0 :(得分:2)
将用户的创建与添加验证规则分开:
function userFactory(user) {
if (typeof user === 'undefined') {
user = new User();
}
user.firstName.extend({required: true});
}
然后你可以这样做:
var newUser = userFactory(ko.mapping.fromJS(data, {}, new UserModel()));
this.user(newUser);
...并保持验证。