Услуга перевода звонков с обратного вызова, зарегистрированного в разделе app.config
Я относительно новичок в AngularJS, и проблема, с которой я сталкиваюсь, - это один из тех сценариев типа "я хочу внедрить Сервис в app.config", который, как я понимаю, сделать невозможно. (Меня устраивает различие между Сервисом и Поставщиком, и почему Сервис не может быть внедрен в.config.)
Я пытаюсь использовать угловую схему вместе с угловым переводом, чтобы заголовки полей в сгенерированных формах переводились.
Есть проблема, когда кто-то спрашивает, как это сделать, и совет состоит в том, чтобы воспользоваться преимуществами angular-schema-form. postProcess
, которая является собственностью Провайдера. Этот обратный вызов дает вам объект формы перед его рендерингом, давая вам возможность манипулировать им с помощью пользовательского кода. Поэтому перевод мог быть сделан в пределах здесь.
postProcess
метод вызывается у провайдера, так что это делается в 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.
Так что, по-видимому, это место, где у меня есть возможность манипулировать контрольными заголовками и так далее.
Что касается библиотеки углового перевода, для "ручного" перевода строк я могу использовать $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. Это может быть сделано изнутри контроллеров, устраняя проблему доступа к $translate
оказание услуг. Я могу в конечном итоге пойти по этому пути, но было бы неплохо понять лучшее решение для вышеуказанного сценария.