dojo.connect / dojo.hitch范围问题?

时间:2009-08-27 08:34:23

标签: dojo

我有一个程序员类,用项目名称和复选框填充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);
    }   
},  

3 个答案:

答案 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);
});