2016-05-18 18 views
0

誰でも、ある時間間隔の後にng-repeatを再実行するのを手伝ってください。 私はしばらくの間、配列を持っており、私はいくつかのサーバー時間と比較しています。しばらくしてから、私は手動でアレイを繰り返してください。角度jsでng-repeatを再実行するには

$scope.list = { 
    "SERVER_DATE_TIME": "2016-05-16T10:04:36.318-05:00", 
    "list": [{ 
     "displayDate": "2016-05-16T10:03:36.318-05:00", 
     "pageId":"1" 
    }, { 
     "displayDate": "2016-05-16T10:02:36.318-05:00", 
     "pageId":"2" 
    }, { 
     "displayDate": "2016-05-16T10:01:36.318-05:00",m 
     "pageId":"3" 
    }] 
} 

HTML:

<div class="list" ng-repeat="list in newsList track by list.pageId"> 
    <span elapsed-time data-datetime="list.displayDate"> </span> 
</div> 

Javascriptを:

$interval(function() { 
    // update "SERVER_DATE_TIME" and re run 
    $scope.list = angular.copy($scope.list); 
}, 1000 * 5 * 60); 

ので、経過時間ディレクティブでは、時間の差分を示すSERVER_DATE_TIMEと表示日付を比較しています。

$$hashKeyが利用可能であるため、トラックを挿入しないとうまくいきます。しかし、もし私がlist.pageIdでトラックを入れたら、は配列に存在せず、再実行は起こっていません。

私はこの作業を手伝ってください。あなたはあなただけの$ scope.listと角度を更新する必要があります..データ上で「繰り返しますが」する必要はありません

+2

AngularJSは、データがスコープ内で変更されると、データを自動的に「再反復」します。 – d4rty

+1

ところで、scope.list変数を定義するには、list.listにループする必要がありますか? scope.listがループしている配列であることを確認してください。サーバーからの結果を解析し、値の配列をscope.listに直接コピーできます。 – MiltoxBeyond

+0

Ya、list.listのみを使用しています、ここではそのタイプミスです。ユーザーがサービスを呼び出すまで、データは同じままです。しかし、一定の時間間隔で私は時間を更新する必要があります – user2587222

答えて

0

は自動的に(つまり、データバインディングです;)それを適用します

<div class="list" ng-repeat="l in listl.list track by l.pageId"> <span elapsed-time data-datetime="l.displayDate"> </span> </div> 
+0

私の時間は定期的な間隔で変更する必要があります。しかし、私のデータは同じです – user2587222

+0

あなたは日付を更新した後に$ scope.apply()を使ってみましたか? – MayK

+0

は$ interval(function(){})を使用しています。だからその必要はありません – user2587222

0

それはですあなたのリストのデータが実際には変更されていないので、強制的にng-repeatを再起動するのは悪い考えです。変更されたのはサーバーの時間ですので、 代わりにelapsedTimeディレクティブがそれを処理するのがより理にかなっていると思います。

あなたのようなディレクティブ何かにSERVERTIMEを渡すことができます。

<span elapsed-time data-datetime="listItem.displayDate" data-servertime="serverTime"> </span> 

あなたのディレクティブのようなSERVERTIME何かのウォッチャー作成します。あなたは//更新を行うだろうコントローラで

$scope.$watch('servertime', (serverTime) => {//re-eveluate relative time}); 

を」 SERVER_DATE_TIME "を$ intervalループで実行し、ng-repeatの再トリガーについて心配する必要はありません。

+0

だから、このシナリオを扱うための任意のアイデア? – user2587222

+0

あなたは何を意味するのかよく分かりません。あなたのコメントで言及したように、あなたは実際のデータリストをリフレッシュしたり、私が理解する限り、サーバーから新しいデータを得ることはありません。あなたの時間だけが変化するので、強制的にリフレッシュする必要はありません(**実際には、これを行う必要はありません。角度のデータバインディングとダイジェストサイクルではそうする**) 「私が最初にひどく設計したものをどうやってハックすればいいの?」というようなものがもっと好きです。角度のあるやり方を理解するのにもう少し時間を費やすことができます。 –

0

データpageIdは変更されていないため、この要素はすでにレンダリングされており、再度レンダリングする必要はありません。 track byは、リスト/配列内の要素を一意に識別するために使用されます。 track by $indexを使用すると、すべて正常に動作します。 pageIdで要素を追跡する理由はありますか? 並べ替えまたはフィルタリングする場合は、track byの代わりに適切なフィルタを使用する必要があります。たとえば、並べ替えの場合はthis oneです。

+0

ya、ソートや日付によるフィルタリングを使用しています。もし私が$ indexを使用すると、問題が発生します。それを釘付けする方法はありますか? – user2587222

+0

$ indexでトラックを使用していても動作しません。 – user2587222

+0

はい、そうですが、$ indexは変更されていないので動作しません。まだあなたがpageIdによって追跡している理由は分かりませんでした。私はソートとフィルタリングのために私の答えを更新しました。 –

関連する問題