Knockoutjs视图模型结构

时间:2014-10-22 14:16:03

标签: 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, etc这样的权限我必须在复选框中使用。都是布尔。 现在我的问题是,处理权限对象的最佳方法是什么。创建自己的模型?或者我可以使用这样的东西:

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

1 个答案:

答案 0 :(得分:4)

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

例如:

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对象直接传递给新的视图模型,让它担心实例化这些属性。

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