前言
$translatePartialLoader(以下简写为TPL)是angular-translate中的局部加载器,由于该加载器可以以模块为单位同时加载多个国际化文件,因此成为angular开发SAP必选的加载器。
问题
事实上,如果按照官网的教程来编写,会出现TPL不生效的情况,具体表现为在config过程中添加模块有效,但是在controller中添加模块无效。
按照官网的说法,在controller中添加模块后必须刷新国际化数据,因此官方建议通过直接调用$translate.refresh(),或者监听addPart所触发的事件并调用refresh这两种方式来刷新数据。然而按照官网的写法这两者都是无效的。
原理分析
国际化数据刷新过程中会根据变量$uses来判断所当前使用的语言,如果当前$uses为空,则放弃这部分操作。而$uses会在translate模块初始化过程中被赋值,因此如果当模块尚未初始化完毕,$uses尚未被赋值时执行刷新是无效的「注:其实不完全无效,这里涉及fallback,不做过多讨论」。
而translate初始化过程中会调用指定的loader获取数据,这个过程是一个异步操作,所以$uses的赋值也要等到异步操作完成后才行,在此期间会出现刷新失效。
解决方式
问题找到了,解决起来也简单,在translate初始化完毕后强制刷新一次即可,代码如下:
var initListener = $rootScope.$on('$translateChangeEnd', function () {
initListener();
$translate.refresh();
});