角度1滤波翻译

时间:2017-01-18 10:40:03

标签: javascript angularjs translation

我在ng-repeat内部运行过滤器以进行每行的翻译。 我发送过滤器3参数:

  1. 需要翻译的字符串(默认返回)。
  2. 事件ID(字符串属于此事件)。
  3. 语言代码(用户首选)。
  4. 过滤器使用2个参数向服务发送数据:

    1. 语言代码。
    2. 事件ID(字符串属于此事件)。
    3. 服务器响应包括已翻译的字符串。

      问题在于我无法从"然后功能"中得到响应。我试图使用promises和$ q resolve,但仍然没有succsess。

      代码:

      //* 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;
                  }
              }
          }
      }]);
      

      我不明白我做错了什么。

1 个答案:

答案 0 :(得分:0)

我觉得你不应该使用异步过滤器。它们引入了更多的状态,并将逻辑推离服务和控制器。

Angular依赖于返回简单对象的过滤器或返回容易打印的数据类型。承诺既不是那样的。在Angular1.2之前,您只需更改promise中的值,UI就会更新。

从Angular 1.3开始,过滤器不会更新,因此,只有输入发生变化时,显示的数据才会发生变化。您可以使用filter.$stateful=true通知角度您的过滤器需要更新,但不鼓励这样做。

另一个帖子中的答案很好地阅读了这个https://stackoverflow.com/a/27771259/1408733