我对 AngularJS 比较陌生,我面临的问题是“我想将服务注入 app.config”类型的场景之一,我意识到这是无法完成的。(我对 Service 和 Provider 之间的区别感到满意,以及为什么不能将 Service 注入到 .config 中。)
我想要完成的是将angular-schema-form与angular-translate一起使用,以便翻译生成表单中的字段标题。
有一个问题是有人问如何做到这一点,并且给出的建议是利用 angular-schema-form's postProcess,这是 Provider 的属性。此回调在呈现之前为您提供表单对象,让您有机会使用用户代码对其进行操作。因此翻译可以在这里完成。
该postProcess方法在 Provider 上调用,因此它在 app.config 中完成:
app.config(function(schemaFormProvider, $translateProvider) {
schemaFormProvider.postProcess(function(form){
// within here I can inspect the form object, find all
// properties whose key is "title", and then perform
// language translation on their values.
所以,这显然是我有机会操纵控制标题等的地方。
转到 angular-translate 库,让我“手动”翻译字符串,我可以使用该$translate服务。这提供了同步和异步方法来翻译给定的键字符串。同步的是$translate.instant(key).
要将这两者粘合在一起,到目前为止我尝试过的(确实有效)是创建一个像这样的“桥”方法:
var app = angular.module('myApplicationName', ['schemaForm', 'pascalprecht.translate']);
....
app.config(function(schemaFormProvider, $translateProvider) {
schemaFormProvider.postProcess(function(form){
// ... code here which iterates over properties
// and finds all control titles ...
key = app.myTranslate(key);
// ....
}
....
});
app.myTranslate = function (key) {
var service = angular.injector(['ng', 'myApplicationName']).get("$translate");
return service.instant(key);
}
这确实有效,但它看起来丑陋且不安全(因为可能无法保证$translate在第一次调用回调时准备好)并且调用angular.injector(['ng', 'myApplicationName']).get...可能很昂贵。
考虑到我正在使用的库的限制,有没有更好的方法,或者这是我完成它的唯一方法?
我还完全考虑了一种替代方法,即在 angular-schema-form 处理模式或表单对象之前对其执行转换。这可以在控制器内部完成,消除访问$translate服务的问题。我可能最终会走这条路,但了解上述情况的最佳解决方案仍然会很好。