Angular перевод внутри службы

Я борюсь с угловым переводом для своего ионного приложения. Дело в том, что у меня есть сервис с данными для обмена между представлениями, но мне нужно перевести эти данные. К сожалению, я просто вижу пустой экран без каких-либо ошибок в консоли.

Я был бы признателен, если бы кто-нибудь помог, если с этим кодом что-то не так (я использую useStaticFilesLoader):

app.service('customService', function($q, $rootScope, $filter, $translate) {

    $rootScope.$on('$translateChangeSuccess', function () {     
        var $translate = $filter('translate');                      

    return {
    items: [
      {
        id: '1',        
        title:$translate('TITLE');
      }
    ]
],
    getItems: function() {
      return this.items;
    },
    getItem: function(itemId) {
      var dfd = $q.defer();
      this.items.forEach(function(item) {
        if (item.id === itemId) dfd.resolve(item);
      });

      return dfd.promise;
    }

 };
});
});

person devjs11    schedule 21.03.2015    source источник
comment
Просто мои 2 цента: определяя var $translate;, вы перезаписываете поставщика $translate, введенного в службу, что может вызвать проблемы. Вам следует вообще избегать использования $ в именах переменных.   -  person Dan Mindru    schedule 22.03.2015


Ответы (1)


Попробуйте что-то вроде этого:

app.factory('customService', function($rootScope, $translate) {
    var items = [],
        updateItems = function() {
            items.length = 0;
            $translate('TITLE').then(function(title) {
                items.push({
                    id: '1',
                    title: title;
                });
            });
        };
    updateItems();
    $rootScope.$on('$translateChangeSuccess', updateItems);
    return {
        items: items,
        getItem: function(itemId) {
            var result;
            items.forEach(function(item) {
                if (item.id === itemId) {
                    result = item;
                }
            });
            return result;
        }
    }
});
person Brian Lewis    schedule 21.03.2015
comment
Большое спасибо за ответ. Это так странно, но я пытаюсь использовать ваш первый код, и кажется, что items: items просто пусты. Как будто массив не заполняется при $translateChangeSuccess. Как вы думаете, это возможно исправить? - person devjs11; 22.03.2015
comment
захватывается ли событие $translateChangeSuccess? Вы должны иметь возможность поставить точку останова в $rootScope.$on('$translateChangeSuccess', function() { ... }. - person Brian Lewis; 22.03.2015
comment
Да, я верю. Он просто не заполнит var items = []; Например, если я поставлю что-то вроде var items = [1,2]; затем появляются 2 элемента. Но оставляя его пустым, элементы не возвращаются, даже если мы указываем их внутри $rootScope.$on('$translateChangeSuccess'.... - person devjs11; 22.03.2015
comment
правильно... вам, вероятно, нужно push() результаты в массив элементов - person Brian Lewis; 22.03.2015
comment
Ты был прав. Нажатие массива помогло, но title: $translate('TITLE'); вернуть только скобки {}. Странно то, что использование $translate.instant показывает нам перевод в порядке. Вы бы порекомендовали его использовать? Я где-то читал, что лучше сначала использовать фильтр... - person devjs11; 22.03.2015
comment
похоже, что $translate возвращает обещание. Я обновлю свой ответ. - person Brian Lewis; 22.03.2015
comment
Это неудобно, но при переходе к этому списку из дома моего приложения список отображается пустым, но если я перезагружу страницу, список появляется. Что может быть причиной этого? Спасибо за вашу помощь, удивительно, что вы так хорошо справляетесь! - person devjs11; 22.03.2015
comment
Вероятно, это просто состояние гонки. Событие, вероятно, запускается до того, как служба будет готова. Позвольте мне изменить код. - person Brian Lewis; 22.03.2015
comment
Добавление $translate.refresh(); перед var items = []; помог исправить навигацию. Мне все еще нужно использовать var $translate = $filter('translate'); К сожалению, item.length не помог. Если вы подтвердите использование transalte.refresh, я могу подтвердить, что на данный момент все в порядке. - person devjs11; 22.03.2015