2012-12-04 28 views
1

我有看起來像這樣的淘汰賽視圖模型:推的項目與映射插件創建一個observableArray它的創建後

var TagViewModel = function (allPrincipals) { 
    var self = this; 

    self.name = ko.observable(tagName); 

    var principalMapping = { 
     create: function(options) { 
      return { 
       label: options.data.name, 
       key: options.data.type + '___|' + options.data.name, 
       icon: options.data.type == "User" ? "img/misc/user20.png" : "img/misc/group20.png" 
      }; 
     }, 
     key: function(data) { 
      return data.key; 
     } 
    }; 

    self.allPrincipals = ko.mapping.fromJS(allPrincipals, principalMapping); 
} 

allPrincipals會是這個樣子:

var allPrincipals = [{name: "Alex" type: "User"}, {name: "John", type: "User"}, {name: "Staff", type: "Group}] 

因此,在創建視圖模型的時候,我們有這樣的事:

var vm = new TagViewModel(allPrincipals); 

這工作得很好。

然而,在視圖模型,我需要能夠在推新的項目到allPrincipals觀察到的陣列(由映射插件創建)

什麼是做到這一點的最好方法是什麼?

因此,舉例來說,有在視圖模型是一個函數:

self.addPrincipal = function(prinipal){ 
    //allPrincipals.push(?) 
} 

回答

1

您可以定義一個類來創建Principal對象:

function Principal(data){ 
    var self = this; 

    self.label = data.name; 
    self.key = data.type + '___|' + data.name; 
    self.icon = data.type == "User" ? "img/misc/user20.png" : "img/misc/group20.png"; 
} 

然後在映射選項,並在使用它addPrincipal功能:

var principalMapping = { 
    create: function(options) { 
     return new Principal(options.data); 
    }, 
    key: function(data) { 
     return data.key; 
    } 
}; 

self.addPrincipal = function(prinipal){ 
    self.allPrincipals.push(new Principal(prinipal)); 
}