2011-12-05 13 views
0

我定義這個JavaScript視圖模型:KnockoutJS:使用ko.toJSON(this)時,初始值不會發布到服務器?

function PersonViewModel() { 
    // Data members 
    this.Name = ko.observable(); 
    this.Function_Id = ko.observable(); 
    this.SubFunction_Id = ko.observable(); 
    this.Functions = ko.observableArray(); 
    this.SubFunctions = ko.observableArray(); 

    // Whenever the Function changes, update the SubFunctions selection 
    this.Function_Id.subscribe(function (id) { 
     this.GetSubFunctions(id); 
    }, this); 

    // Functions to get data from server 
    this.Init = function() { 
     this.GetFunctions(); 
     this.Function_Id('@(Model.Function_Id)'); 
    }; 

    this.GetFunctions = function() { 
     var vm = this; 

     $.getJSON(
      '@Url.Action("GetFunctions", "Function")', 
      function (data) { 
       vm.Functions(data); 
      } 
     ); 
    }; 

    this.GetSubFunctions = function (Function_Id) { 
     var vm = this; 
     if (Function_Id != null) { 
      $.getJSON(
       '@Url.Action("GetSubFunctions", "Function")', 
       { Function_Id: Function_Id }, 
       function (data) { 
        vm.SubFunctions(data); 
       } 
      ); 
     } 
     else { 
      vm.SubFunction_Id(0); 
      vm.SubFunctions([]); 
     } 
    }; 

    this.Save = function() { 
     var PostData = ko.toJSON(this); 

     var d = $.dump(PostData); 
     alert(d); 

     $.ajax({ 
      type: 'POST', 
      url: '/Person/Save', 
      data: PostData, 
      contentType: 'application/json', 
      success: function (data) { 
       alert(data); 
      } 
     }); 
    }; 
} 

$(document).ready(function() { 
    var personViewModel = new PersonViewModel(); 
    personViewModel.Init(); 

    ko.applyBindings(personViewModel); 
}); 

當點擊提交按鈕,從選擇列表中的數據被公佈,但不是「Function_Id」。

當我在功能下拉列表中選擇一個不同的值,然後單擊提交按鈕,'Function_Id'的值被正確發佈。

如何解決這個問題?

+0

Function_Id不是this.Function_Id,它只是傳遞給具有相同名稱的函數的參數。 –

回答

0

這是因爲這個關鍵字在JavaScript

this.Init = function() { 
    this.GetFunctions(); // this === PersonViewModel.Init 
    this.Function_Id('@(Model.Function_Id)'); // calls PersonViewModel.Init.Function_Id(...) 
}; 

範圍,可以儲存的refrence到PersonViewModel實例。

var self = this; 
self.Init = function() { 
    self.GetFunctions(); 
    self.Function_Id('@(Model.Function_Id)'); // calls PersonViewModel.Function_Id(...) 
}; 
相關問題