javascript - Knockoutjs View 模型结构

标签 javascript knockout.js

我在构造我的 Knockoutjs 模型时仍然遇到一些问题。
我从服务器获取的数据如下所示:

var data = {
    Creation: "2012-01-01T00:00:00Z",
    Id: 3,
    LastActivity: null,
    Name: "Foo",
    Permissions: {
        IsAdmin: false,
        IsInternal: false,
        // ... some more boolean
    },
};

现在我创建一个这样的模型:

var getDetails = function (user, edit) {
    UserModel = function() {
        var self = this;
        user = user || {
            Id: 0,
            Username: '',
            Creation: new Date(),
            LastActivity: new Date(),
            Name: '',
            Permissions: {
                IsAdmin: false,
                IsInternal: false,
                // ... some more boolean
            },
            Stores: []
        };

        this.Id = ko.observable(user.Id);
        this.Username = ko.observable(user.Username);
        this.Creation = ko.observable(user.Creation);
        this.LastActivity = ko.observable(user.LastActivity);
        this.Name = ko.observable(user.Name);

        // how handle the permissions ???

    };

IsAdmin、IsInternal等这样的权限我必须在复选框中使用。全部都是 bool 值。 现在我的问题是,如何处理权限对象的最佳方法。创建自己的模型?或者我可以使用这样的东西:

 this.Permissions.IsAdmin = ko.observable(user.Permissions.IsAdmin);

最佳答案

我将通过为权限类型创建另一个 View 模型来解决这个问题,因为它是一个复杂的类型并且需要存储多个值。面向对象编程万岁!

例如:

var PermissionsModel = function(permissions){ 
    var self = this;

    self.IsAdmin = ko.observable(permissions.IsAdmin || false);
    self.IsInternal = ko.observable(permissions.IsInternal || false);
}

然后在您的UserModel中添加一个Permissions属性,如下所示:

var UserModel = function(user, edit) {
    var self = this;       

    self.Id = ko.observable(user.Id || 0);
    self.Username = ko.observable(user.Username || "");
    self.Creation = ko.observable(user.Creation || new Date());
    self.LastActivity = ko.observable(user.LastActivity || new Date());
    self.Name = ko.observable(user.Name || "");
    self.Permissions = new PermissionsModel(user.permissions || {});
}

现在,您可以将 data.permissions 对象直接传递给新 View 模型,并让它负责实例化这些属性。

<小时/> 一个半相关的小注释:您可以直接在 observable 函数中分配默认值。这样做的好处是您不再需要在类中创建匿名对象。此外,当您添加/编辑模型时,您不必再跟踪该对象。您可以直接更改/添加属性。

关于javascript - Knockoutjs View 模型结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26509601/

相关文章:

Javascript 函数解释 - Knockout.js

javascript - 获取kendo调度程序中选定 View 的开始和结束日期以过滤数据库查询中的事件

javascript - 分组并存储 html 'data' 属性

javascript - React 状态获取 "corrupted"

javascript - knockout 订阅语法

javascript - knockout : Order of the bindings evaluation when using click and checked bindings in the same time

javascript - Node.js 休息框架

javascript - 如何在不影响其他数据的情况下编辑本地存储数据?

javascript - observable 和 computed 无法正常工作 Knockout

javascript - knockout 到计算列的自定义绑定(bind)