角度翻译竞争条件

时间:2014-07-03 15:40:05

标签: angularjs race-condition angular-translate

我使用angular-translate-loader-partial遇到了竞争条件。

首先,我使用$translatePartialLoader.addPart(partname)更改加载器的状态,这需要更新表。 See API for details

接下来,我致电$translate(translateKey)。这开始了一场比赛。它可能会也可能不会显示翻译,具体取决于语言文件是否已加载。

在使用$ translate之前,如何确保我的部分文件都已加载?

1 个答案:

答案 0 :(得分:0)

一个选项是挂钩$ translatePartialLoaderStructureChanged事件。只有在部件可用时才会触发。

确保该部件具有可用性:

        $rootScope.$on('$translatePartialLoaderStructureChanged', function (e, Part_Name) {
            if (Part_Name === 'PartThatYouNeed') {
                $translate.refresh().then(function () {
                    $translate(translateKey);
                });
            }
        });

如果要在整个应用程序中使用它,也许是一个更好的选择,您可以挂钩此事件并在应用程序运行命令中调用刷新功能

app.run(function ($state, $rootScope, $translate) {
        $rootScope.$on('$translatePartialLoaderStructureChanged', function (e, Part_Name) {
            $translate.refresh();
        });
});

如果您需要在语言表可访问后运行设置代码,我建议在刷新完成后发出rootScope:

app.run(function ($state, $rootScope, $translate) {
    $rootScope.$on('$translatePartialLoaderStructureChanged', function (e, Part_Name) {
        $translate.refresh().then(function () {
            $rootScope.$emit('ApplicationTranslationsRefreshed', Part_Name);
        });
    });
});

在您的应用中的任何位置之后,您可以挂钩ApplicationTranslationsRefreshed事件,以了解$ translate(' key_that_is_in_the_new_part')何时可用:

        $rootScope.$on('ApplicationTranslationsRefreshed', function (e, Part_Name) {
            console.debug(Part_Name + "is now avaialable")
        });