Услуга перевода звонков с обратного вызова, зарегистрированного в разделе 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 оказание услуг. Я могу в конечном итоге пойти по этому пути, но было бы неплохо понять лучшее решение для вышеуказанного сценария.

0 ответов

Другие вопросы по тегам