$translatePartialLoader加载失败及解决方式

前言

$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();
});

相关文章

ANGULAR.JS:NG-SELECTANDNG-OPTIONSPS:其实看英文文档比看中...
AngularJS中使用Chart.js制折线图与饼图实例  Chart.js 是...
IE浏览器兼容性后续前言 继续尝试解决IE浏览器兼容性问题,...
Angular实现下拉菜单多选写这篇文章时,引用文章地址如下:h...
在AngularJS应用中集成科大讯飞语音输入功能前言 根据项目...
Angular数据更新不及时问题探讨前言 在修复控制角标正确变...