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

dojo.connect/dojo.hitch范围问题?,dojo,Dojo,我有一个程序员类,它用项目名称和复选框填充ul-当单击复选框时,弹出对话框应该显示程序员id和项目名称。dojo.connect应该为每个li设置onclick,但项目(i)默认为最后一个值(windows)。知道为什么会这样吗 ... projects: {"redial", "cms", "android", "windows"}, name: "Chris", id: "2", constructor: function(programmer) { this.name = pro

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

刚刚发现附加参数可以附加到挂接装置:

dojo.connect(tickNode, 'onclick', dojo.hitch(this, function() {  
            this.update(this.id, i)
}));
应该是:

dojo.connect(tickNode, 'onclick', dojo.hitch(this, "update", this.id, i));

刚刚发现附加参数可以附加到挂接装置:

dojo.connect(tickNode, 'onclick', dojo.hitch(this, function() {  
            this.update(this.id, i)
}));
应该是:

dojo.connect(tickNode, 'onclick', dojo.hitch(this, "update", this.id, i));

为什么要调用此.render()?这是您的功能还是小部件库(即已在生命周期中)?为了更好地度量,请确保调用this.inherited(参数);在后期创建中

我的猜测是,tickNode还不在DOM中,因此connect无法工作。在设置连接之前,请尝试附加复选框。最后一个被激发,因为它被引用保留。您可以尝试以下方法:

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);
    });
}
for(var i=0;i

我也会考虑去看doj.Cube,而不是CaleEngEnter。祝你好运

为什么要调用此.render()?这是您的功能还是小部件库(即已在生命周期中)?为了更好地度量,请确保调用this.inherited(参数);在后期创建中

我的猜测是,tickNode还不在DOM中,因此connect无法工作。在设置连接之前,请尝试附加复选框。最后一个被激发,因为它被引用保留。您可以尝试以下方法:

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);
    });
}
for(var i=0;i

我也会考虑去看doj.Cube,而不是CaleEngEnter。祝你好运

或者,我认为它更简洁,您可以将上下文作为第三个参数传递到dojo.connect中:

dojo.connect(tickNode, 'onclick', this, function() {  
  this.update(this.id, i);
});

或者,我认为它更简洁,您可以将上下文作为第三个参数传递到dojo.connect:

dojo.connect(tickNode, 'onclick', this, function() {  
  this.update(this.id, i);
});

这是草率的,创建了一个不必要的、无法重用的闭包。在这种情况下,使用dojo.hitch是不必要的开销,其成本超过创建闭包的成本。这是草率的,创建了一个不必要的、无法重用的闭包。在这种情况下,使用dojo.hitch是不必要的开销,其成本超过创建闭包的成本关闭。