为什么我不能将我的事件处理程序放在我的Dijit小部件的类声明上?

时间:2011-07-15 21:40:22

标签: javascript dojo

如果我在实例化我的小部件时定义了我的点击处理程序:

new W2({onClick: a_function});

postMixinProperies期间或postCreate期间

dojo.declare("W2", [W1], {
    postMixInProperties: function(){
        this.onClick= a_function;
    }
});

或通过其中一种陈述性方法

<div data-dojo-type="W2">
    <script
        type="dojo/connect"
        data-dojo-event="onClick">
        a_function.call(this);
    </script>
</div>

dojo发挥其魔力并使其成为domNode上的onclick事件触发我的onClick处理程序。

,如果我将onClick定义放在类声明上,那么连接显然会被破坏:

dojo.declare("W2", [W1], {
    onClick: a_function
});

仍然可以直接拨打my_widget.onClick,不再在onclick个事件后自动调用它。

为什么会发生这种情况,这是正常的,为我的窗口小部件类定义事件处理程序的“标准方法”是什么?


W1的

编辑代码:

dojo.declare("W1", [dijit._Widget, dijit._Templated], {
    label: 'defaultLabel',
    templateString: '<div>${label}</div>' 
});

1 个答案:

答案 0 :(得分:2)

您需要在模板化小部件中定义attach事件,以将DOM事件连接到函数。

尝试做一些像:

dojo.declare("W1", [dijit._Widget, dijit._Templated], {
    label: 'defaultLabel'
    , templateString: "<div data-dojo-attach-event='onclick: onClick'>${label}</div>"
});

然后,您可以在类声明中放置onClick,它将连接到DOM事件。

dojo.declare("W2", [W1], {
    onClick: a_function
});

如果窗口小部件没有模板化,超级类已经将DOM事件连接到名为onClick的函数,那么设置onClick函数就可以了。

dojo.declare("W1", [dijit._Widget, dijit.form.Button], {
    label: 'defaultLabel'
});

如果窗口小部件没有模板化并且超级类没有将DOM事件连接到函数,那么您需要建立连接。

dojo.declare("W1", [dijit._Widget], {
    label: 'defaultLabel'
    , postCreate: function () {
        this.inherited(arguments);
        dojo.create('div', {innerHTML: 'defaultLabel'}, this.domNode)
        this.connect(this.domNode, "onclick", "onClick");
    }
});