我有一个程序员类,用项目名称和复选框填充ul - 当单击一个复选框时,弹出对话框应该显示程序员ID和项目名称。 dojo.connect应该为每个li设置onclick但是项目(i)默认为最后一个值(windows)。任何想法为什么会发生这种情况?
...
projects: {"redial", "cms", "android", "windows"},
name: "Chris",
id: "2",
constructor: function(programmer) {
this.name = programmer.name;
this.id = programmer.id;
this.projects = programmer.projects;
},
update: function(theid, project) {
alert(theid + ", " + project);
},
postCreate: function() {
this.render();
// add in the name of the programmer
this.programmerName.innerHTML = this.name;
for(var i in this.projects) {
node = document.createElement("li");
this.programmerProjects.appendChild(node);
innerNode = document.createElement("label");
innerNode.setAttribute("for", this.id + "_" + i);
innerNode.innerHTML = i;
node.appendChild(innerNode);
tickNode = document.createElement("input");
tickNode.setAttribute("type", "checkbox");
tickNode.setAttribute("id", this.id + "_" + i);
if(this.projects[i] == 1) {
tickNode.setAttribute("checked", "checked");
}
dojo.connect(tickNode, 'onclick', dojo.hitch(this, function() {
this.update(this.id, i)
}));
node.appendChild(tickNode);
}
},
答案 0 :(得分:3)
刚刚发现额外的参数可以附加到挂钩上:
dojo.connect(tickNode, 'onclick', dojo.hitch(this, function() {
this.update(this.id, i)
}));
应该是:
dojo.connect(tickNode, 'onclick', dojo.hitch(this, "update", this.id, i));
答案 1 :(得分:0)
你为什么要调用this.render()?这是你的功能还是小部件基础(即已经在生命周期中)?为了更好的措施,请确保调用this.inherited(参数);在postCreate。
我的猜测是,tickNode尚未在DOM中用于连接工作。尝试在设置连接之前附加复选框。最后一个被解雇,因为它是通过引用保留的。您可以尝试这样的事情:
for(var i = 0; i < this.projects.length; i++) {
var p = this.projects[i];
node = document.createElement("li");
this.programmerProjects.appendChild(node);
innerNode = document.createElement("label");
innerNode.setAttribute("for", this.id + "_" + p);
innerNode.innerHTML = p;
node.appendChild(innerNode);
tickNode = document.createElement("input");
tickNode.setAttribute("type", "checkbox");
tickNode.setAttribute("id", this.id + "_" + p);
if(i == 0) { //first item checked?
tickNode.setAttribute("checked", "checked");
}
node.appendChild(tickNode);
dojo.connect(tickNode, 'onclick', function(e) {
dojo.stopEvent(e);
this.update(this.id, p);
});
}
我也会考虑调查dojo.create而不是createElement。祝你好运!
答案 2 :(得分:0)
或者,我认为它更清晰,您可以将上下文作为第三个参数传递给dojo.connect:
dojo.connect(tickNode, 'onclick', this, function() {
this.update(this.id, i);
});