2017-02-06 4 views
0

角度jsで経過日時を表示するフィルタを作成しようとしていて、うまくいきました。今、私はそれに翻訳を追加しようとしていますが、キーの代わりに値を表示しています。私の問題は、翻訳がフィルタが実行されている間に読み込まれないためだと思います。カスタムフィルタの角度変換に関する問題

私は

if(hours){ 
        result+= " "+hours+$translate.instant("elapsedFull.hours"); 
       } 
       if(minutes){ 
        result+= " "+minutes+$translate.instant("elapsedFull.minutes"); 
       } 
       if(seconds){ 
        result+= " "+seconds+$translate.instant("elapsedFull.seconds"); 
       } 

のようなコードに翻訳をしようとしていますplunkerのリンクをチェックして、私は問題を解決する方法を教えてください。

Plunker

答えて

2

あなたのフィルタは、ステートフルフィルタ以下のようにする必要があります:

var elapsedFull = function($translate,$timeout){ 
    function myFilter(date){ 
     var duration = Date.now() - date; 
     var seconds = (duration/1000) | 0; 
     duration -= duration * 1000; 
     var minutes = (seconds/60) | 0; 
     seconds -= minutes * 60 
     var hours = (minutes/60) | 0; 
     minutes -= hours * 60; 
     var days = (hours/24) | 0; 
     hours -= days * 24; 
      var result=""; 
      if(days){ 
       result = days+"d"; 
      } 
      if(hours){ 
       result+= " "+hours+$translate.instant("elapsedFull.hours"); 
      } 
      if(minutes){ 
       result+= " "+minutes+$translate.instant("elapsedFull.minutes"); 
      } 
      if(seconds){ 
       result+= " "+seconds+$translate.instant("elapsedFull.seconds"); 
      } 
     return result; 
    } 
    myFilter.$stateful = true; 
    return myFilter; 
    } 

AngularJSは同じ引数を与えた場合、あなたのフィルタ機能は、同じ結果を返すことを想定しています。したがって、フィルタリングされた結果をキャッシュして、フィルタを呼び出さないようにします。では、フィルタの結果を非同期的に計算したい場合はどうすればよいでしょうか?フィルタは約束を返すことはできません。少なくとも未定義の値を返す必要があります。将来的に価値を再計算し、何か他のものを返すことが、最高の希望です。このようなフィルタはステートフルと呼ばれ、返された関数のプロパティ$statefultrueに設定する必要があります。