2017-01-18 14 views
0

Пробег фильтр внутри ng-repeat для перевода каждый ряд. Я отправляю на фильтр 3 параметра:угловой 1 фильтр перевод

  1. Строка, которая должна быть переведена (для возврата по умолчанию).
  2. Идентификатор события (строки относятся к этому событию).
  3. Языковой код (предпочитаемый пользователем).

Фильтр отправить данные в службу с 2-мя параметрами:

  1. Языковой -код.
  2. Идентификатор события (строки относятся к этому событию).

Ответ сервера включает переведенную строку.

Проблема в том, что я не могу получить ответ из «затем функции». Я попытался использовать обещания и решить $ q и до сих пор не добился успеха.

Код:

//* Filter translate this *// 
app.filter('translateThis', ['$q', 'translateEvents', function ($q,  translateEvents) { 
    var pending = {}; 
    // FILTER WRAPPER TO COPE WITH ASYNCHRONOUSLY 
    return function(item, eventId, lngCode) { 
     // check if eventId it exits and it must to be integer 
     var check = isInt(eventId); 
     if (check == false) { 
      return item; 
     } 
     if ($localStorage.doTranslateEvents == 2) { 
      if (!(item in pending)) { 
       pending[item] = null; 
       translateEvents.translate(lngCode, eventId).then(function (response) { 
        console.log(response.data);// i get the data here ! 
        pending[item] = response.data; 
       }); 
      } 
      console.log(pending[item]);// i do not get it here ! 
      return pending[item] || item; 
     } else { 
      return item; 
     } 
    }; 
} 

/* the following service is responsible to translate events 
* finally this service returns promise. 
*/ 
    app.service('translateEvents',['$q', '$localStorage', '$http', 'rootUrl', '$rootScope', '$timeout', function ($q, $localStorage, $http, rootUrl, $rootScope, $timeout) { 
    return { 
     translate : function (toLanguageCode, eventId) { 
      /* 
      * Then we do lng from and lang to validation and set defaults. 
      */ 
      if (eventId != null || eventId != undefined) { 
       if (toLanguageCode != 'en' && toLanguageCode != 'he' && toLanguageCode != 'ru' && toLanguageCode != 'es' && toLanguageCode != 'tr' && toLanguageCode != 'de' && toLanguageCode != 'fr' && toLanguageCode != 'it' && toLanguageCode != 'nl' && toLanguageCode != 'gan' && toLanguageCode != 'zh' && toLanguageCode != 'ja' && toLanguageCode != 'no' && toLanguageCode != 'ko' && toLanguageCode != 'pt' && toLanguageCode != 'tlh' && toLanguageCode != 'ar') { 
        toLanguageCode = 'en'; 
       } 
       return $http.get("https://xxx?id=" + eventId + "&lng=" + toLanguageCode); 
      } else { 
       return null; 
      } 
     } 
    } 
}]); 

Я не понимаю, что я делаю неправильно.

+0

Можете ли вы предоставить код? –

+0

Что значит? – avix

+0

дайте вашему коду ожидать html. –

ответ

0

Мне нравится думать, что вы не должны использовать асинхронные фильтры. Они вводят больше состояний и отталкивают логику от служб и контроллеров.

Угловая зависимость зависит от того, как фильтры возвращают простые объекты или возвращают легко печатаемые типы данных. Обещания не являются ни тем, ни другим. До Angular1.2 вы могли бы просто изменить значение в обещании, и пользовательский интерфейс будет обновляться.

В отношении фильтров Angular 1.3 не обновляются, поэтому часто отображаемые данные изменяются только в том случае, если ваш вход изменяется. Вы можете использовать filter.$stateful=true, чтобы сообщить, что ваш фильтр нуждается в обновлении, но это не рекомендуется.

Этот ответ в другом потоке хорошо читать на этом https://stackoverflow.com/a/27771259/1408733