2013-05-08 72 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