javascript - 如何处理 Knockout ViewModel 中的空对象和满对象

标签 javascript knockout.js

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

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

所以我的绑定(bind)是在更高级别配置的,我有一个带有名为 User 属性的 View 模型。这个名为 User 的属性已绑定(bind)到我的表单。对于创建新用户的简单场景,我会调用:

this.User(new UserModel());

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

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

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

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

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

<小时/>

作为旁注,使其变得更加复杂:

User.ConfirmEmail 存在于我的 View 模型中,但不在服务器上!这就是我的下一个障碍。如果我使用 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);

...并保留验证。

关于javascript - 如何处理 Knockout ViewModel 中的空对象和满对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35220742/

相关文章:

asp.net-mvc-3 - MVC 将 JSON ViewModel 传递给 View

javascript - 解压属性后,Knockout 停止更新 observable

javascript - Javascript对象在构造过程中可以调用自己的方法吗?

javascript - React 在加载图像时从数据加载 HashMap 像

javascript - 将 JQuery 事件绑定(bind)到通过 jquery 加载页面后创建的 html

jquery - View 中的粘性页脚而不是 shell.html

javascript - 如何绑定(bind) CSS background-image 属性?

javascript - 使用 Knockout.js 将 Canvas 绑定(bind)到 UI

javascript - 使用 React Async 渲染数组未定义

javascript - 将标签的内容存储在 Javascript 变量中