2017-01-18 8 views
0

私はフィルターの内側にng-repeatの各行の翻訳を実行します。 私はフィルターに3つのパラメーターを送信します:角1フィルターの翻訳

  1. 翻訳する必要のある文字列(デフォルトの戻り値)。
  2. イベントID(文字列はこのイベントに属します)。
  3. 言語コード(ユーザーが推奨)。

    1. 言語-code:

    フィルタは、2つのパラメータとサービスにデータを送信します。

  4. イベントID(文字列はこのイベントに属します)。

サーバー応答には、変換された文字列が含まれます。

問題は、「機能」から応答を取得できないことです。私は約束と$ 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までは、約束の値を変更するだけでUIが更新されます。

角度1.3ではフィルタが更新されないため、入力が変更されると表示されるデータのみが変更されることがあります。 filter.$stateful=trueを使用して、フィルタの更新が必要なことを知らせることができますが、これはお勧めできません。別のスレッドで

この答えは、このhttps://stackoverflow.com/a/27771259/1408733