使用Durandal,我们在视图上有最后几分钟处理的compositionComplete事件。 目前我的视图合成层次结构非常复杂,我需要在应用程序的不同位置进行各种UI处理。
为了避免多次调用相同的UI相关代码,并保证在某些视图需要时至少调用一次,我需要在某处使用finalCompositionComplete()钩子。
我在当前的Durandal实现中没有找到这样的事件,所以我想将它添加到composition.js
文件中(我发现endComposition()
函数是一个很好的起点。 ..)
出于维护原因,修改原始的durandal文件显然是一个坏主意。
是否有更好的解决方案?一个更易于维护的解决方案..
到目前为止我做了什么(似乎工作):
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);