2012-11-20 90 views
0

我正在使用knockout.js映射函數來映射我從服務器端asp.net應用程序接收到的json對象。使用Chrome的調試器,我可以看到json對象正在被接收,但是當我使用ko.mapping.fromJS創建可觀察對象時,所有內部可觀察數組都顯示爲長度0.在QCTest中有多個數組。如何使用映射功能訪問可敲陣列敲除

var testDefJSON = getTestDefJSON(); 
var ViewModel = function() { 
    var self = this; 
    self.QCtest = ko.mapping.fromJS(testDefJSON); 
    self.hasBuiltNewGroup = ko.observable(false); 
    self.selectedOp = ko.observable(); 
    self.selectedUom = ko.observable(); 
    self.addTestGroup = function() { 
     show_modal("createGroupModal"); 
    }; 
    self.saveTest = function() { 
     var jsData = ko.toJS(ViewModel); 
     var json = JSON.stringify(jsData); 
     $.ajax({ 
      type: 'POST', 
      url: '/Test/SaveTest', 
      async: false, 
      data: json, 
      contentType: "application/json", 
      success: function (result) { alert(result) }, 
      error: function() { alert("failed to post test data"); } 
     }); 
    }; 
    self.delItems = function() { 
     alert(self.QCtest.QCTestGroups.length); 
    }; 
    self.closeItemModal = function() { 
     ViewModel.hasBuiltNewGroup(false); 
     close_modal(); 
    }; 
    self.createNewGroup = function() { 
     ViewModel.hasBuiltNewGroup(true); 
    }; 
    self.addNewTestItem = function() { 
     alert("Adding new test item button works"); 
    }; 
}; 
var viewModel = new ViewModel(); 
ko.applyBindings(viewModel); 

我所有的UI元素的出現只是因爲他們應該在使用一個foreach /模板通過內部陣列。然而,當我點擊我的delItems按鈕時,警報彈出並指出內部數組QCTestItems的長度爲0,當它至少應爲1(但數組中的許多測試項目)時。

我需要能夠刪除按DelItems按鈕時檢查的項目。爲此,我需要訪問該數組中的元素,並且由於其長度爲0,所以很難做到這一點。

任何幫助,將不勝感激

編輯:

改變self.delItems = function() { alert(self.QCtest.QCTestGroups.length); };self.delItems = function() { alert(self.QCtest.QCTestGroups().length); };

,現在,它的工作原理

回答

0

映射插件將改變你的JSON轉換成觀測量。可觀察到的(包括ObservableArray)是一個函數,所以一定要確保你使用()形式訪問的實際值:

alert(self.QCtest().QCTestGroups().length); 

這裏是展示一個小提琴:http://jsfiddle.net/jearles/cH7h3/

按一下按鈕,一旦選項已加載。顯示一個警報,顯示兩個長度值,一個直接訪問該數組(顯示長度爲0),另一個訪問內部數組(顯示實際長度爲2)。

+0

謝謝,現在這個警告提供了可觀察元素的適當數量。我將用添加的()來測試所有其他的東西。 – lbdm44