我有一个自定义小部件。窗口小部件具有连接到DOM节点的click事件的功能。后来我想把第二个函数连接到第一个函数。
但是,只有当我首先将函数名称而不是函数引用传递给connect
函数时,这才有效。
这将有效:
this.connect(this.domNode, 'onclick', 'onClick' /*<-- Function name*/);
this.connect(this, 'onClick', 'onClick2');
这不会:
this.connect(this.domNode, 'onclick', this.onClick /*<-- Function reference*/);
this.connect(this, 'onClick', 'onClick2');
Here是展示行为的小提琴。当您单击带有文本“功能名称”的窗口小部件时,将显示两个警报,当您单击带有“功能参考”文本的窗口小部件时,将只显示一个警报。
这是某种错误还是我误解了什么?
答案 0 :(得分:0)
这不是一个错误,它是预期的行为。你得到不同结果的原因是因为Dojo在&#34;之前保持了这种状态。和&#34;之后&#34;。我先解释一下,电话的区别。
在this.connect(this.domeNode, 'onclick', 'onClick');
的情况下,您要传递函数的字符串参数。在内部,它会调用this['onClick']()
之类的东西,这里的函数与小部件中的函数相同(范围也是维护的,即小部件)。
在第二种情况下,您将函数参数作为函数的一个实例传递(您也可以创建一个var functionParam = this.onClick
并将其作为参数传递,它将是相同的),因为它已经是函数,dojo将执行类似于functionParameter()
(此处范围将是小部件)。由于范围&amp;对于这两种情况,函数都是相同的,函数的执行方式或输出结果没有区别。
移动到有趣的部分,当您在执行原始函数后设置另一个要调用的函数时。 Dojo必须在某处维护这些信息,因此它用包含after, before and original function
等所有信息的对象/函数替换原始函数。它有一个按顺序执行它们的机制。
所以回答你的问题,第一种情况,dojo内部将执行它已替换你的函数的方法,因此也将调用第二个函数。在第二种情况下,将调用您传递的方法的实例,而不是小部件的函数(widget.onClick
),因此不会调用第二个函数。
同时避免使用connect
,这是一种弃用的方法,内部将使用dojo/on
和dojo/aspect
。您也可以使用它们并降低Dojo为您做的成本。
不推荐使用,将在2.0中删除,使用this.own(on(...))或 this.own(aspect.after(...))代替。