我有以下功能:
function setAccounts(data){
var node = dijit.byId("res");
dojo.empty("res");
for(var i = 0; i <= data.length; i++){
var itemWidget = new dojox.mobile.ListItem({
id: data[i].id,
rightText: "€ "+data[i].amount,
moveTo: "transactions",
label: data[i].name
});
node.addChild(itemWidget);
dojo.connect(itemWidget, "onclick", getTransactions(data[i].id));
}
}
在页面加载时,它不会将新itemWidget的onClick事件连接到函数getTransactions,但它只是运行该函数。错误在哪里?
数据是通过ajax获得的json,我已经检查过json读取/解析中没有错误。
答案 0 :(得分:1)
Dojo的'connect'方法期望HTMLElement作为第一个参数。但是,您创建的dojo小部件实际上是非常专业的JavaScript对象 - 尽管它们倾向于在.domNode
属性下使其HTMLElement可用。
实际上,我所知道的最简单的解决方案是使用ListItem中可用的onClick属性。
var itemWidget = new dojox.mobile.ListItem({
id: data[i].id,
rightText: "€ "+data[i].amount,
moveTo: "transactions",
label: data[i].name,
onClick: dojo.hitch(this, 'getTransactions', data[I].id)
});
如果您最终将connect
- 其他事件发送到窗口小部件,我建议将其写为itemWidget.connect(targetNode, etc
- 据我所知,这将删除事件侦听器,如果/当窗口小部件本身是破坏。
答案 1 :(得分:1)
你的函数立即运行一次的原因是因为你在这里调用它:
dojo.connect(itemWidget, "onclick", getTransactions(data[i].id));
您应该做的是在单击元素时传递稍后将被调用的函数。您可以使用dojo.partial
执行此操作,这将创建一个在调用时将使用特定参数调用的函数。您还可以显式传递窗口小部件的DOM节点,这是@Katana314所提到的。如果您想保留当前的代码布局,以防止修改项目的创建,这是您可以轻松完成的。
dojo.connect(itemWidget.domNode, "onclick", dojo.partial(getTransactions, data[i].id));
答案 2 :(得分:0)
试试这个,
function setAccounts(data){
var node = dijit.byId("res");
dojo.empty("res");
for(var i = 0; i <= data.length; i++){
var itemWidget = new dojox.mobile.ListItem({
id: data[i].id,
rightText: "€ "+data[i].amount,
onclick:getTransactions,
moveTo: "transactions",
label: data[i].name
});
node.addChild(itemWidget);
}
}
var getTransactions=function(){
//your code.
}