Javascript dojo attachevent。我想在一个完全不同的组件中触发一个处理程序

Javascript dojo attachevent。我想在一个完全不同的组件中触发一个处理程序,javascript,dojo,Javascript,Dojo,在道场, 你可以做一些这样的事情 <div id='outer' dojoType=OuterWidget> <div dojoType=InnerWidget dojoAttachEvent='onmousein:_privateHandler, on...'> </div> </div> 但我的场景是,我希望像这样对我的应用程序小部件布局进行声明性描述,但是让内部组件的mousein事件触发外部组件上的处理程序 我可能不得不求助于

在道场, 你可以做一些这样的事情

<div id='outer' dojoType=OuterWidget>
  <div dojoType=InnerWidget dojoAttachEvent='onmousein:_privateHandler, on...'>
  </div>
</div>

但我的场景是,我希望像这样对我的应用程序小部件布局进行声明性描述,但是让内部组件的mousein事件触发外部组件上的处理程序

我可能不得不求助于onmousein='dijit.byId(“outer”).outerHandler() 但看起来dojo应该有一种方法来做到这一点

另外,在一个相关的not(如果有人知道如何做扩展点)上,我想说,内部元素的扩展点应该只引用外部元素的某个处理程序。(现在唯一的区别是我想将扩展点指向外部处理程序,而不仅仅是本机DOM事件。)

我非常感谢你们在这方面提供的任何帮助:)

Dijit确实有一种用于实现包含容器的关系的小部件的方法,但它基本上是在DOM中进行一次漫游,查找带有Dijit小部件标记的节点(一个widgetid属性,IIRC。一旦建立了这种关系,您应该能够简单地执行类似于dojo.connect的操作,将一个事件绑定到另一个事件。您最好避免使用ID,因为它们是特定于实例的。这有点像使用全局变量。

我发现这是有效的: Asume html表示父类的模板,父类始终包含一个子类:

<div > // no id or dojoType specified in the parent's template:
    <div dojoType='innerWidget' idOfWidgetThatShouldHandleMouseIn=${id}>
    </div>
</div>
//父级模板中未指定id或dojoType:

${id}将映射到父组件创建的任何*实例*的确切id。

Peller,是的,它类似于全局变量,但我使用声明性标记描述我的应用程序。id必须是唯一的。开发组件背后的整个概念是,它们应该能够存在于任何父组件之外,或任何父组件内,只要数据以某种方式提供给他们。让我知道你的想法。请参阅我的答案:这就是你可能希望避免ID的原因。如果你想在标记中创建一个可复制的模式,你应该依赖其他模式来定位相关代码。你可以使用其他模式,比如寻找即时模式或执行基于类的查询。当innerWidget和outerWidget之间的关系不明显时,这应该可以工作,并且可能有意义。其他时候,您可能有innerWidget/outerWidget的关系,其中小部件应该能够基于其他关系找到彼此。这样,您就不需要此id,并且可以使用这个代码带有复制/粘贴。谢谢。但是考虑到这个级别的声明,是为了在应用程序级别上编译程序,而不是可重用组件级别。在单独的组件级别,我将不要求组件知道它正在运行什么上下文。但是在应用程序级别上,这个标记级别是为了指导组件,它们运行在什么上下文中。我认为这就像连接Mac OS X Cocoa应用程序一样。请注意,如果一个小部件需要能够根据关系找到另一个小部件,我希望仍然有孩子不知道父母。其他方法也可以。这两种模式都有自己的位置。