Как мне добавить «onload» в мой класс Dojo? - PullRequest
1 голос
/ 13 июля 2009

Я бы хотел добавить функцию "onload" в мой пользовательский класс Dojo, чтобы он мог вызывать функции, которые регистрируются для события - что-то вроде myWidget.addOnLoad (...)

Мой класс не Dijit, это простой класс, использующий dojo.declare. После создания вызывается несколько функций (xhr и т. Д.) Для инициализации класса, и мне нужна возможность уведомить другие функции javascript о том, что виджет загружен и готов.

Ответы [ 3 ]

3 голосов
/ 14 июля 2009

Рассматривали ли вы возможность использования dojo.publish () для публикации темы, когда виджет будет готов? Или, если другой код имеет ссылку на виджет, вы можете вызвать пустую функцию в экземпляре виджета, когда ваш виджет загружен (назовите его «загруженным»), а затем другой код, имеющий ссылку на экземпляр, может выполнить .подключиться к «загруженному» методу этого экземпляра виджета, чтобы получать уведомления при вызове метода.

1 голос
/ 17 июля 2009

Как уже указывал jburke 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.loaded() после того, как закончите загрузку a.

0 голосов
/ 13 июля 2009

Так что я пошел дальше и в основном скопировал функции Dojo addOnLoad и добавил его в свой класс. Кажется, это работает. Я смотрел на паб / саб или 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();
    }
}
...