如何在挖空视图模型中处理空对象和满对象

How to handle empty and full objects in a Knockout ViewModel

本文关键字:对象 满对象 处理 视图 模型      更新时间:2023-09-26

我似乎无法在堆栈上找到我正在寻找的答案。也许我的情况是错误的,但无论如何我都会问这个问题。我有一个表格,有两个目的...创建新用户和查看用户。两者具有相同的视图模型User。那么让我们看看我的视图模型:

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 的属性。 这个名为 User 的属性绑定到我的窗体。对于创建新用户的简单方案,我会调用:

this.User(new UserModel());

注意:this.User是可观察到的,因此括号。

这将成功创建具有空白表单的用户模型,并且所有验证都有效。

好的,所以场景二!我从 API 获得一个完整的对象,我应该如何映射它。如果我使用:

this.User(ko.mapping.fromJS(data, {}, UserModel));

验证不起作用。我已经看到了包含create方法的映射选项,但是如何在不丢失顶部功能的情况下使用它?!


作为旁注,使其稍微复杂一点:

User.ConfirmEmail存在于我的视图模型中,但不存在于服务器上!这就是我的下一个障碍。如果我使用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()它仍然可以设置属性,我也可以传递值。它看起来很糟糕:(

将用户的创建与有效性规则的添加分开:

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);

。并保留验证。