2015-06-10 69 views
1

我想在構造函數內使用映射插件,所以我可以很容易地將其他函數添加到構造函數,並具有從映射插件自動創建的可觀察項目。這裏是我目前擁有的代碼,但它既沒有映射我提供的可觀察變量,也沒有在末尾viewmodel中映射'save'函數。有一個更好的方法嗎?使用Knockoutjs映射插件裏面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); 

回答

3

您的代碼不工作,因爲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 
     }); 
    } 

}; 
+0

我知道這是一些小事,感謝幫幫我。 – PlTaylor

2

沒有理由使用構造函數(使用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); 
+0

您提出了一個有效的觀點。 – PlTaylor

0

還保存是一個私有方法,編寫保存這樣的:

self._save =函數(){}