2014-10-22 3 views
0

У меня все еще есть проблемы с структурированием моих моделей knockoutjs.
Данные, которые я получил от сервера выглядит следующим образом:Knockoutjs viewmodel structure

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

создать модель представления для типа разрешений, т.е. 'PermissionsModel = function (permissions) {IsAdmin = ko.observable(); // ... и т. д.}, а затем в вашем 'UserModel' добавить' self.Permissions = new PermissionsModel (user.Permissions); ' –

+0

в порядке, я думал, что это правильный путь. – chris

ответ

4

Я хотел бы подойти к этому, создавая другую модель представления для типа разрешений, так как это сложный тип и должен хранить несколько значений. Объектно-ориентированное программирование Hooray!

Например:

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. Положительная сторона этого заключается в том, что вам больше не нужно создавать анонимный объект внутри вашего класса. Кроме того, когда вы идете добавлять/редактировать свою модель, вам больше не нужно отслеживать этот объект. Вы можете просто изменить/добавить свойства напрямую.

+0

спасибо за ваш ответ и подсказки! – chris

Смежные вопросы