2013-05-08 64 views
0

爲什麼這個元素未定義時,我嘗試使用jQuery選擇元素綁定的數據:選擇元素屬性通過淘汰賽

<ul data-bind="attr: {id: panelId}"></ul> 

panelId被定義爲Knockoutjs視圖模型屬性:

var VM = function() { 
     var self = this, 
      date = new Date(); 
     self.panelId = "panel-" + date.getTime(); 

     $("#"+self.panelId).doSomthing(); // element is undefined 
    } 

在Chrome開發人員工具中檢查頁面,我可以看到id被指定爲像這樣

<ul data-bind ... id="panel-1368039734501"</ul> 

panelId屬性不一定是observable。但我試圖讓它可觀察,但結果相同。

有人嗎?

+2

你在哪裏叫'ko.applyBindings'?因爲你應該在**之前這樣做**你嘗試調用'$(「#」+ self.panelId).doSomthing()'... – nemesv 2013-05-08 19:13:06

+0

'ko.applyBindings(new VM())'在ready ready handler :'$(function(){ko.applyBindings(new VM());})'。 – Javid 2013-05-08 19:21:51

+2

如果您試圖對元素執行操作,聽起來像是自定義綁定處理程序的完美候選人。 – Posthuma 2013-05-08 19:27:36

回答

1

問題是ID屬性只適用於ko.applyBindings調用,但您嘗試在ID之前通過ID查找元素。

爲了避免這種情況,做這樣的事情:

var VM = function() { 
    var self = this, 
     date = new Date(); 
    self.panelId = "panel-" + date.getTime(); 
} 

var vm = new VM(); 
ko.applyBindings(vm); // Adds the ID attribute 

$("#"+vm.panelId).doSomething(); // This needs to be after ko.applyBindings 
+0

感謝您的明確答覆。經過兩個小時的掙扎之後,我找到了答案。我有一個主視圖模型,它有一個虛擬對象的obsservableArray()。我在主ViewModel中編寫了一個函數,它遍歷虛擬機的'observableArray()',併爲它們中的每一個調用'$(「#」+ vm.panelId)'。我這樣調用這個函數:'var mainVM = new ManinVM',然後'ko.applyBinding(mainVM)',然後如你在回答'mainVM.theFuncI mentioned();' – Javid 2013-05-09 13:42:30