<html>
<head>
<script>
    require(["dojo/ready"],function(ready){

      function init(dataItem) {
          alert("inside init method")
          updateData(dataItem);
      }
      function updateData(dataItem){
       //inside this function, i am creating some breadcrumb and making each part of it a link.
       //Now that link is calling another method outerFunction()
      }
      ready(function(){
          init({
              type: "All Locations",
              id: "All_Locations"
          });
      });
   });

function outerFunction(jsonObj){
    init(jsonObj); // not working

}
</script>
</head>
<body>
   <div>
    </div>
</body>
</html>

所以基本上我需要从init()调用outerFunction()
请帮助我。

我需要从init()调用上面定义的outerFunction()
但是,这没有发生。
最初,我试图将此outerFunction()保留在require块内。
但是在那种情况下,就不会从面包屑链接中调用outerFunction()了。

所以我不得不将其移到外面。现在从外面调用outerFunction(),但没有从init()调用outerFunction()
或者,如果我可以以任何方式在内编写 outsideFunction 方法,则需要块,并且可以进行相同的调用流程。

解决方案:我已经在ready中使用了dojo.subscribe(),而在externalFunction()中使用了dojo.publish()。它为我工作。

最佳答案

好吧,这确实是一个范围问题。您可以通过多种方式解决它。其中之一就是像您提到的那样将outerFunction()放入require()块中。

但是,如果您从其他地方调用该函数,则可能会遇到问题。对于面包屑链接(您提到的),可以在同一require()块内使用onclick处理程序,例如:

on(breadcrumbLink, "click", function() {
    outerFunction({});
});

但是,一旦代码量增加,如果将它们全部放入同一个require()块(因为它将变得不可维护),就会遇到问题,因此您可以将init()函数拆分为一个单独的模块,该模块可以包括两个功能。

第三种解决方案(尽管经常这样做是很不好的做法),但是将其中一个放在window范围内。例如,如果将init()函数移动到window,则:
window.init = init;

然后,您可以从outerFunction()中访问它。另一种方法是将outerFunction()移动到require()块内,并将其也添加到window中,例如:
require(/** Stuff */, function() {
    function init() { }

    function outerFunction() { }
    window.outerFunction = outerFunction;
});

关于javascript - 从dojo的require内部编写的require外部调用函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30998970/

10-09 15:02