杜兰达:一个组合完成统治他们所有

时间:2014-04-17 08:57:29

标签: javascript durandal lifecycle

使用Durandal,我们在视图上有最后几分钟处理的compositionComplete事件。 目前我的视图合成层次结构非常复杂,我需要在应用程序的不同位置进行各种UI处理。

为了避免多次调用相同的UI相关代码,并保证在某些视图需要时至少调用一次,我需要在某处使用finalCompositionComplete()钩子。

我在当前的Durandal实现中没有找到这样的事件,所以我想将它添加到composition.js文件中(我发现endComposition()函数是一个很好的起点。 ..)

出于维护原因,修改原始的durandal文件显然是一个坏主意。

是否有更好的解决方案?一个更易于维护的解决方案..

到目前为止我做了什么(似乎工作):

  • 在durandal的plugins目录中创建了一个lifecycle插件(并将其注入到合成模块中)
  • 修改了composition.js文件的endComposition()功能
  • 现在我可以通过我的生命周期插件注册回调,并在最后调用一次

composition.js文件中的endComposition()函数:

function endComposition() {
    compositionCount--;

    if (compositionCount === 0) {
        setTimeout(function(){
            var i = compositionCompleteCallbacks.length;

            while(i--) {
                try{
                    compositionCompleteCallbacks[i]();
                }catch(e){
                    system.error(e);
                }
            }

            // my modification is right here:
            lifecycle.finalCompositionComplete();
            compositionCompleteCallbacks = [];
        }, 1);
    }
}

生命周期插件

define(['durandal/system', 'underscore'], function (system, _) {

        var _nameCounter = 0;
        var _processes = {};

        return {
            registerFinalProcess: register,
            finalCompositionComplete: processFinal
        };

        function register(processName, callback) {
            processName = processName || '_noname' + _nameCounter++;
            _processes[processName] = callback;
        }

        function processFinal() {
            _.each(_.pairs(_processes), function(pair) {
                try {
                    if (typeof pair[1] === 'function') {
                        pair[1]();
                    }
                    delete _processes[pair[0]];
                } catch(e) {
                    system.log('error:could not call ' + pair[0]);
                }
            });

            _processes = {};
            _nameCounter = 0;
        }

    });

随时随地在我的应用中

lifecycle.registerFinalProcess('someCallbackId', someFunction);

0 个答案:

没有答案