1

次のようなノックアウト ビュー モデルがあります。

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

したがって、viewModel が作成されると、次のようになります。

var vm = new TagViewModel(allPrincipals);

これはうまくいきます。

ただし、ビュー モデルでは、新しい項目を allPrincipals 観測可能配列 (マッピング プラグインによって作成) にプッシュできる必要があります。

これを行う最善の方法は何ですか?

たとえば、ビューモデルには次の関数があります。

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

1 に答える 1

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));
}
于 2012-12-04T13:14:19.217 に答える