在dojo

时间:2015-06-23 09:29:01

标签: javascript html asynchronous dojo

<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()

或者,如果以任何方式我可以在 require 块中编写 outerFunction 方法,并且可以进行相同的调用流程

解决方案:我在readyFunction()中的ready和dojo.publish()中使用了dojo.subscribe()。它对我有用。

1 个答案:

答案 0 :(得分:3)

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

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

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

但是,一旦代码量增加,如果将所有内容放入同一个require()块(因为它将无法维护),您就会遇到问题,因此您可以拆分{ {1}}函数到一个单独的模块,可以包含在两个函数中。

第三种解决方案,如果经常做的话,这是一个非常糟糕的做法,就是将其中任何一个放在init()范围内。如果您将window功能移至init(),例如:

window

然后您可以在window.init = init; 内访问它。另一种方法是移动outerFunction()块内的outerFunction()并将其添加到require(),例如:

window