Javascript dojo如何重写dijit类方法
我需要重写Tree.js中的onClick方法。有没有通用的方法覆盖dojo/dijit类方法?您可以使用:Javascript dojo如何重写dijit类方法,javascript,dojo,dom-events,Javascript,Dojo,Dom Events,我需要重写Tree.js中的onClick方法。有没有通用的方法覆盖dojo/dijit类方法?您可以使用: dojo.connect(tree, 'onClick', function(item) { /** Your Action **/ }); 我有点困惑,因为你已经在做这个了 你有一些选择,这取决于你想做什么 重击法 在像onClick这样的真正存根的情况下,它可能与在小部件实例上重击该方法一样简单 以编程方式: var myWidget = new dijit.Tree({
dojo.connect(tree, 'onClick', function(item) {
/** Your Action **/
});
我有点困惑,因为你已经在做这个了 你有一些选择,这取决于你想做什么 重击法 在像
onClick
这样的真正存根的情况下,它可能与在小部件实例上重击该方法一样简单
以编程方式:
var myWidget = new dijit.Tree({
...,
onClick: function(item, node, evt) {
/* handler code here */
}
};
//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”
此解决方案可能感觉有点次优,因为它涉及到连接到建议为私有的方法。然而,无论openOnClick
是否正确,这种方法都应该有效。如果确定要将openOnClick
设置为true
,则可以编写一个函数,然后将其连接到onClick
和onOpen
(两个函数都传递了项,然后是节点)
编辑#2:公共函数,以编程方式连接
为了回答您的后续问题,我想以相反的顺序来回答它们——因为如果您对以编程方式连接感兴趣,它实际上会使另一个问题更容易回答
因此,首先,回答您的connect
问题:您肯定不想使用dojo.byId
,因为这不是给您树小部件,而是给您一些与小部件关联的DOM节点(可能是最上面的)。一般来说,dojo
方法对dijit
东西一无所知
你想做什么,就是我上面建议的。在这里,它是根据您尝试的代码应用的。还要注意,onClick
有一个大写字母C,这是另一个一般规则:小部件事件使用驼峰大小写表示法,作为区别于普通DOM事件的一种方法,普通DOM事件不使用驼峰大小写
var mytree = dijit.byId("mytree");
mytree.connect(mytree, "onClick", function(item) {
/* ... */
});
现在,为了进一步解决您的其他问题,如果您想将一些常见功能绑定到onClick
和onOpen
和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由浏览器解析
- 所有
d模块都已加载dojo.require
- 如果在
中设置djConfig
,则文档HTML中定义的所有小部件都将被实例化parseOnLoad:true
dojo.require
s之后的某个时间,在脚本中,您可以执行以下操作:
dojo.ready(function() {
/* code from previous example goes here */
});
试试看
另外,如果您对阅读感兴趣,我实际上已经写了我在本编辑中涉及的几个主题:
\onClick
方法来执行您想要的操作。因为我们已经知道我在问什么问题。请你写几行代码作为回应好吗。考虑到我的代码是:console.debug(“我们在这里”);我到底应该写什么?很抱歉说得不清楚。我已经添加了一个样本,完全按照我在对另一个答案的评论中所说的去做-我真的不确定是什么让人难以理解。。。但我还是很困惑,因为在那个帖子上,你说你把openOnClick
改为false
,这也能解决你的问题。首先,如果你不想回答,就不要回答。其次,我认为它解决了我的问题,因为我可以通过单击节点捕捉事件,并通过单击“+”符号展开节点。但实际上我需要两种功能。我之所以一次又一次地问你,是因为我无法将你的答案与我能用的东西联系起来。我没有网络经验,只有两个词回答“使用点击”没有帮助。再说一次,你不必回答。
var mytree = dijit.byId("mytree");
mytree.connect(mytree, "onClick", function(item) {
/* ... */
});
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(function() {
/* code from previous example goes here */
});