dojo如何覆盖dijit类方法

时间:2011-01-27 22:23:18

标签: javascript javascript-events dojo

我需要覆盖Tree.js中的onClick方法。是否有任何常用的方法来覆盖dojo / dijit类方法?

2 个答案:

答案 0 :(得分:10)

我有点困惑,因为你已经在last question you posted中做了这个。

你有几个选择,取决于你想做什么。

Clobbering方法存根

对于像onClick这样的真实存根,它可能就像在窗口小部件实例上破坏该方法一样容易。

编程:

var myWidget = new dijit.Tree({
    ...,
    onClick: function(item, node, evt) {
        /* handler code here */
    }
};

或以声明方式(这与您在上一个问题中所做的完全相同):

<div dojoType="dijit.Tree" ...>
    <script type="dojo/method" event="onClick" args="item,node,evt">
        /* handler code here */
    </script>
</div>

连接到方法调用

在其他情况下,也许您需要在调用给定方法时执行某些操作,在这种情况下,您可以使用窗口小部件的connect方法(这是dojo.connect的更好版本,它将自动清除当小部件被销毁时本身。在这种情况下,你可以这样做:

编程:

//execute the given function whenever myWidget's onClick method is called
myWidget.connect(myWidget, 'onClick', function(item, node, evt) {
    /* handler code here */
});

声明地说,除了type="dojo/method"之外,这可以与上面的内容完全相同,请确保使用type="dojo/connect"

<div dojoType="dijit.Tree" ...>
    <script type="dojo/connect" event="onClick" args="item,node,evt">
        /* handler code here */
    </script>
</div>

请注意,当您像这样连接时,您的代码将在连接调用的方法之后执行。如果你需要在之前做一些,你最好的选择可能是dojo.declare你自己的小部件扩展。如果你需要走得那么远,我会详细说明,但我认为你可能会选择上述选项之一。

编辑#1:连接点(没有双关语......哦,哎,是的)

由于我的answer to the original question附加的评论似乎在某种程度上不够明确,所以这里有一个代码块,根据简单的两个步骤完全修改该问题中的原始代码在该评论中解释。唯一微小的皱纹是传递给_onClick的论点略有不同。

<div dojoType="dijit.Tree" ...>
    <script type="dojo/connect" event="_onClick" args="node,evt">
        /* handler code here. In this case, item is accessible via node.item */
    </script>
</div>

此解决方案可能会感觉有点次优,因为它涉及连接到建议为私有的方法。但是,无论openOnClick是否为真,它都应该有效。如果您确定将openOnClick设置为true,则可以编写单个函数,然后将其连接到onClickonOpen(两者都可以)获得传递项目,然后传递节点)。

编辑#2:通用功能,以编程方式连接

要回答您的后续问题,我希望以相反的顺序解决这些问题 - 因为如果您有兴趣以编程方式进行连接,那么实际上会让其他问题更容易回答。

首先,回答你的connect问题:你肯定不想使用dojo.byId,因为它没有给你Tree小部件,它给你一些DOM节点(可能是最顶层的) )与小部件相关联。作为一般规则,dojo方法对dijit内容一无所知。

你想做什么,就是我上面提到的。在这里,它是根据您尝试的代码应用的。另请注意,onClick有一个大写 C - 另一个一般规则:小部件事件使用驼峰式表示法,作为区分它们与没有的明显DOM事件的方法。

var mytree = dijit.byId("mytree");
mytree.connect(mytree, "onClick", function(item) {
    /* ... */
});

现在,为了更进一步并解决您的其他问题,如果您想将一些常用功能绑定到onClickonOpen以及onClose,您可以先定义一个函数,然后将它连接到两者。这是使JavaScript变得非常棒的众多因素之一 - 作为可以轻松传递的第一类对象的函数的可用性。

function handleClick(item) {
    /* do stuff here.
    Inside this function you can assume 'this' is the tree,
    since connect will ensure it runs in-context.
    */
}
var mytree = dijit.byId("mytree");
mytree.connect(mytree, "onClick", handleClick);
mytree.connect(mytree, "onOpen", handleClick);
mytree.connect(mytree, "onClose", handleClick);

现在还有一个重要的问题:我们应该在哪里这个?最好的位置可能在传递给dojo.ready(或dojo.addOnLoad的函数内部,同样的事情,ready被添加为1.4中的同义词,因此它将仅在以下情况下运行:

  • DOM由浏览器解析
  • 所有dojo.require d个模块已加载
  • 如果在parseOnLoad: true中设置djConfig,则文档HTML中定义的所有小部件都将已实例化

所以,在dojo.require之后的某个时间,在脚本中,你会这样做:

dojo.ready(function() {
    /* code from previous example goes here */
});

试一试。

另外,如果你对一些阅读感兴趣,我实际上已经写过我在这个编辑中提到的几个主题:

答案 1 :(得分:1)

您可以使用:

dojo.connect(tree, 'onClick', function(item) {
    /** Your Action **/
});