2012-11-26 42 views
1


我使用knockoutjs版本2.2.0,並有以下的情況:
Javasript代碼
這裏是我的3種型號的JavaScript代碼:「TAB1」,「TAB2」和「視圖模型」
knockoutjs ko.toJs(ko.toJSON)不起作用

var CustomExport = { 
    Tab1: function() { 
     this.tab1Array = ko.observableArray([ 
      {name: "Tab1 Item1"}, 
      {name: "Tab1 Item2"}, 
      {name: "Tab1 Item3"} 
     ]); 
    }, 
    Tab2: function() { 
     this.tab2Array = ko.observableArray([ 
      {name: "Tab2 Item1"}, 
      {name: "Tab2 Item2"}, 
      {name: "Tab2 Item3"} 
     ]); 
    }, 
    viewModel: function() { 
     this.myTab1 = new CustomExport.Tab1(); 
     this.myTab2 = new CustomExport.Tab2(); 
     this.grabData = function(){ 
      alert(ko.toJS(CustomExport.viewModel)); 
     }; 
    }  
} 

ko.applyBindings(new CustomExport.viewModel()); 


所以,總的來說我有2種型號,我想從這些模型的所有數據抓取到一個「視圖模型」模型作爲JSON對象時,grabData功能應該提醒我的模型數據。

這是我HTML代碼

<div data-bind="with: myTab1"> 
    <ul data-bind="template: {name: 'tabTmpl', foreach: tab1Array}"></ul> 
</div> 
<br/> 
<div>------------------------------------------</div> 
<br/> 
<div data-bind="with: myTab2"> 
    <ul data-bind="template: {name: 'tabTmpl', foreach: tab2Array}"></ul> 
</div> 
<br/> 
<input type="button" data-bind="click: grabData" value="Grab all data from Models" /> 


<script id="tabTmpl" type="text/html"> 
    <li> 
     <div data-bind="text: name"></div> 
    </li> 
</script> 


問題如下:
點擊「Grab all data from the models」按鈕,我應該得到它必須包含2款數據警報(」 Tab1','Tab2')作爲json對象,但目前我收到以下警告消息:

function() { 
    this.myTab1 = new CustomExport.Tab1(); 
    this.myTab2 = new CustomExport.Tab2(); 
    this.grabData = function(){ 
     alert(ko.toJS(CustomExport.viewModel)); 
    }; 
} 


另外,我在的jsfiddle Click here to see an example


任何想法,創造了它我究竟做錯了什麼?

+1

CustomExport.viewModel是不實際的參考視圖模型,這個替換它因爲這是實際的視圖模型 – Anders

回答

3

您應該使用this而不是CustomExport.viewModel

this.grabData = function(){ 
    console.log(ko.toJS(this)); 
}; 

但最好爲this創建關閉:

function() { 
    var self = this; 
    self.myTab1 = new CustomExport.Tab1(); 
    self.myTab2 = new CustomExport.Tab2(); 
    self.grabData = function(){ 
     alert(ko.toJS(self)); 
    }; 
} 
+1

更妙的是移動grabData原型聲明 – Anders

+0

謝謝你們(安德斯和阿爾喬姆),你真的幫了我! – Pavlo

相關問題