将onClick侦听器连接到Dojo小部件

qhhrdooz  于 2023-05-27  发布在  Dojo
关注(0)|答案(3)|浏览(222)

我有以下功能:

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阅读/解析没有错误。

uhry853o

uhry853o1#

Dojo的'connect'方法需要HTMLElement作为第一个参数。然而,您创建的dojo小部件实际上是非常专门的JavaScript对象--尽管它们倾向于使其HTMLElement在.domNode属性下可用。
实际上,我所知道的最简单的解决方案是在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-ing其他事件到小部件,我建议将其编写为itemWidget.connect(targetNode, etc-据我所知,如果/当小部件本身被销毁时,这将删除事件侦听器。

zte4gxcn

zte4gxcn2#

你的函数立即运行一次的原因是因为你在这里调用它:

dojo.connect(itemWidget, "onclick", getTransactions(data[i].id));

你应该做的是传递一个函数,当元素被点击时,这个函数将在以后被调用。您可以使用dojo.partial来实现这一点,它创建了一个函数,在调用时将使用特定的参数调用该函数。您还可以显式传递小部件的DOM节点,这是@Katana314提到的。如果您想保持当前的代码布局,以防此时无法轻松地修改项的创建,则可以这样做。

dojo.connect(itemWidget.domNode, "onclick", dojo.partial(getTransactions, data[i].id));
oxcyiej7

oxcyiej73#

试试这个

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.
}

相关问题