【问题标题】:How do I add "onload" to my Dojo class?如何将“onload”添加到我的 Dojo 课程中?
【发布时间】:2009-07-13 12:32:30
【问题描述】:

我想在我的自定义 Dojo 类中添加一个“onload”函数,以便它可以调用为事件注册的函数 - 例如 myWidget.addOnLoad(...)

我的类不是 Dijit,它是一个使用 dojo.declare 的简单类。在创建时,会调用几个函数(xhr 等)来初始化类,我需要能够通知其他 javascript 函数该小部件已加载并准备就绪。

【问题讨论】:

    标签: javascript dojo widget onload


    【解决方案1】:

    您是否考虑过在小部件准备就绪时使用 dojo.publish() 发布主题?或者,如果其他代码引用了小部件,您可以在加载小部件时调用小部件实例上的空函数(称为“已加载”),然后引用该实例的其他代码可以dojo .连接到该小部件实例的“已加载”方法以在调用该方法时获得通知。

    【讨论】:

      【解决方案2】:

      正如jburke already pointed out Dojo 让您轻松:dojo.connect 就是您所需要的。这是一个例子:

      a = {
          loaded: function() { console.log('[a] loaded'); }
      }
      b = {
          dependentAction: function() { console.log('[b] dependentAction'); }
      }
      dojo.connect( a, 'loaded', b, 'dependentAction' );
      a.loaded()
      // prints:
      // [a] loaded
      // [b] dependentAction
      

      然后在完成加载a 后执行a.loaded()

      【讨论】:

      • 缅因州,感谢您提供的清晰示例。我仍将使用 addOnLoaded 作为入口点,但只是调用了 dojo.connect()。
      【解决方案3】:

      所以我继续前进,基本上复制了 Dojo addOnLoad 函数并将其添加到我的班级。它似乎正在工作。我考虑过使用 pub/sub 或 dojo.connect,但我觉得这是最干净、最容易识别的解决方案。

      以下是启动它的必要部分,再次从 dojo.js 中剥离并插入我的课程:

      _onto : function(arr, obj, fn){
          if(!fn){
              arr.push(obj);
          }else if(fn){
              var func = (typeof fn == "string") ? obj[fn] : fn;
              arr.push(function(){ func.call(obj); });
          }
      },
      
      _loaded : function() {
          this._loadNotifying = true;
          this._postLoad = true;
          var mll = this._loaders;
          for(var x = 0; x < mll.length; x++){
              try{
                  mll[x]();
              }catch(e){
                  throw e;
                  console.error("addOnLoad callback failed: " + e, e); /* let other load events fire, like the parser, but report the error */
              }
          }
          this._loadNotifying = false;
          //Make sure nothing else got added to the onload queue
          //after this first run. If something did, and we are not waiting for any
          //more inflight resources, run again.
          if(this._postLoad && this._inFlightCount == 0 && mll.length){
              this._loaded();
          }
      },
      
      addOnLoad : function(/*Object?*/obj, /*String|Function?*/functionName){
          this._onto(this._loaders, obj, functionName);   
          if(this._postLoad && !this._loadNotifying){
              this._loaded();
          }
      }
      

      【讨论】:

      • 我不明白这将如何工作。您是否在此代码示例之外的某个地方调用 _loaded?
      • 你说得对,我在调用 this._loaded() 之前省去了运行的大量代码 - 可以说当所有代码运行完成时它会被调用。
      猜你喜欢
      • 2020-10-14
      • 2018-08-03
      • 1970-01-01
      • 1970-01-01
      • 2019-04-11
      • 1970-01-01
      • 1970-01-01
      • 2016-11-10
      • 1970-01-01
      相关资源
      最近更新 更多