簡體   English   中英

在ViewModel構造函數中使用Knockoutjs映射插件

[英]Using Knockoutjs Mapping Plugin inside viewmodel constructor

我試圖在構造函數中使用映射插件,以便可以輕松地向構造函數添加其他功能,並從該映射插件自動創建可觀察的項目。 這是我當前擁有的代碼,但既沒有映射我提供的可觀察變量,也沒有在最終viewmodel中包含“保存”功能。 有一個更好的方法嗎?

function ViewModel(model){
        var self = this;

        self = ko.mapping.fromJS(model);

        self.save = function() {
            var data = ko.toJSON(self);
            $.post("/Licensing/edit", data, function(returnedData) {
                // This callback is executed if the post was successful
            });
        }

    };

    var vm = new ViewModel(model);
    ko.applyBindings(vm);

您的代碼無法正常工作,因為ko.mapping.fromJS(model); 返回一個新對象,該對象將您分配給self局部變量,並使用save函數進行擴展。

但是,此新對象不是從構造函數中返回的,因此您將以一個空對象結尾,因為最初傳遞給this的未修改。

您可以通過從構造函數返回self來解決此問題:

function ViewModel(model){
    var self = this;

    self = ko.mapping.fromJS(model);

    self.save = function() {
        var data = ko.toJSON(self);
        $.post("/Licensing/edit", data, function(returnedData) {
            // This callback is executed if the post was successful
        });
    }

    return self;
};

或者,您可以告訴映射插件不要創建新對象,只需使用當前創建的對象並將self作為第三個參數傳遞即可:

function ViewModel(model){
    var self = this;

    ko.mapping.fromJS(model, {}, self);

    self.save = function() {
        var data = ko.toJSON(self);
        $.post("/Licensing/edit", data, function(returnedData) {
            // This callback is executed if the post was successful
        });
    }

};

沒有理由使用構造函數(使用new )。 您不會制作多個實例或擁有一個原型。 只需使用ko.mapping為您創建的對象。

function ViewModel(model){
    var self = ko.mapping.fromJS(model);

    self.save = function() {
        var data = ko.toJSON(self);
        $.post("/Licensing/edit", data, function(returnedData) {
            // This callback is executed if the post was successful
        });
    }
    return self;
};

var vm = ViewModel(model);
ko.applyBindings(vm);

另外save是一個私有方法,這樣寫save:

self._save = function(){}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM