原文:我有NG-重複數百個由若干不同的UNIX時間戳的條目中產生的表。我使用的是moment.js,讓它們顯示爲「19分鐘前」或不久之前。我怎麼會具有這些更新每隔五分鐘,例如,而不必刷新整個表(這需要幾秒鐘,會打斷用戶的分類和選擇)。更新「很久以前」的Angularjs和Momentjs值
回答
使用角度的$timeout
服務(只是一個包裝圍繞setTimeout()
)來更新數據。請注意,表示Angular的第三個參數應運行一個$digest
週期,以更新您的數據綁定。
下面是一個例子:http://jsfiddle.net/jandersen/vfpDR/
(這個例子每秒更新,所以你不必等待5分鐘,看看它;-)
我最後不得不scope.apply $()被調用每五分鐘由setInterval重新應用格式化時間戳爲「x分鐘前」的過濾器。也許有點hacky,但它的作品。我確定這不是最佳解決方案。
我相信filters are evaluated every digest cycle,因此使用過濾器來顯示你的「很久以前」的字符串可能會得到CPU昂貴與數百個條目。
我決定去同一個發佈訂閱架構,採用基本eburley's建議的方法(主要是因爲我沒有看對$destroy
事件和手動取消),但有NotificationService,而不是一個「通道」功能:
.factory('NotificationService', ['$rootScope',
function($rootScope) {
// events:
var TIME_AGO_TICK = "e:timeAgo";
var timeAgoTick = function() {
$rootScope.$broadcast(TIME_AGO_TICK);
}
// every minute, publish/$broadcast a TIME_AGO_TICK event
setInterval(function() {
timeAgoTick();
$rootScope.$apply();
}, 1000 * 60);
return {
// publish
timeAgoTick: timeAgoTick,
// subscribe
onTimeAgo: function($scope, handler) {
$scope.$on(TIME_AGO_TICK, function() {
handler();
});
}
};
}])
甲time-ago
指令寄存器/預訂時間戳(post.dt
在下面的示例HTML)與NotificationService:
<span time-ago="post.dt" class="time-ago"></span>
點
.directive('timeAgo', ['NotificationService',
function(NotificationService) {
return {
template: '<span>{{timeAgo}}</span>',
replace: true,
link: function(scope, element, attrs) {
var updateTime = function() {
scope.timeAgo = moment(scope.$eval(attrs.timeAgo)).fromNow();
}
NotificationService.onTimeAgo(scope, updateTime); // subscribe
updateTime();
}
}
}])
幾點意見:
- 我試圖將高效,沒有指令創建一個新的範圍。雖然指令中增加了一個
timeAgo
財產的範圍,在我的使用,這是正常的,因爲我似乎只使用一個NG重複內time-ago
指令,所以我只是補充說,物業給孩子用範圍NG-創建重複。 {{timeAgo}}
將被檢查每個摘要週期,但這應該比運行一個篩選器更快- 我也喜歡這種方法,因爲我沒有計時器在每個時間戳上運行。我有一個定時器在NotificationService中運行。
- 功能
timeAgoTick()
可以由私人性,因爲可能只有NotificationService將需要發佈的時間以前的事件。
我會花一些時間把它放到我的實現中。我目前的實現並不是我觀察的CPU密集型,我認爲整個頁面只有一個計時器,因爲一個計時器稱爲「應用」,但我確信這會更好。謝謝。 –
@CorbinLewis,對不起,我不清楚多個定時器......我在考慮一個替代實現,其中有人可能會在指令中使用$ timeout - 這會導致每個時間戳都有一個單獨的計時器。我同意你的實現只有一個計時器。 –
我爲momentjs https://github.com/jcamelis/angular-moment
<p moment-interval="5000">{{"2014-05-21T14:25:00Z" | momentFromNow}}</p>
我希望它爲你工作的包裝。
我使用以下過濾器。每60秒過濾一次更新值。
angular
.module('myApp')
.filter('timeAgo', ['$interval', function ($interval){
// trigger digest every 60 seconds
$interval(function(){}, 60000);
function fromNowFilter(time){
return moment(time).fromNow();
}
fromNowFilter.$stateful = true;
return fromNowFilter;
}]);
,而在HTML
<span>{{ myObject.created | timeAgo }}</span>
這太酷了! –
這是輝煌! –
- 1. 很久以前合併的No-FF
- 2. 如何計算 「很久以前」 在PHP
- 3. Momentjs更改時區值
- 4. 更新與其他momentjs對象的momentjs對象
- 5. 根據以前的值更新條目
- 6. 更新以前的學科值
- 7. 更新ng-repeat值angularJS和php
- 8. 獲取很久以前在git中刪除的文件
- 9. 很高效地使用AngularJS和ng-repeat更新列表
- 10. 更新web.config恢復以前的更新
- 11. MSSQL更新:更新前的輸出值
- 12. 使用先前更新的值更新
- 13. angularjs範圍值不更新
- 14. AngularJS:自動更新totalPrice值
- 15. 值不進行更新,angularjs
- 16. 更新JSON鍵值 - AngularJS
- 17. Angularjs onkeypress事件更新值
- 18. AngularJS指令作用域在AngularJS以外的值更改時不會更新
- 19. 當前日期和以前的日期和更新目標
- 20. 涼亭更新momentjs不工作
- 21. 用MomentJS更新相對時間
- 22. 在div元素中更新Momentjs FromNow()
- 23. 使用以前的值和新值運行SQL字段值更改
- 24. 很久以前,Laravel項目剛推出localhost
- 25. 顯示「很久以前」,而不是在PHP笨日期時間
- 26. 有很多值的更新列
- 27. 最多可以更新多久?
- 28. 我可以永久更改html按鈕的值和標籤嗎?
- 29. Angularjs ng-repeat不刷新與更新值
- 30. 更新陣列,以在angularjs選中的複選框的值
你的鏈接['$ interval'(https://docs.angularjs.org/api/ng/service/$interval)是正確的,但鏈接文字說「$超時」 – jandersen
請注意,角度還提供[$間隔](https://docs.angularjs.org/api/ng/service/$interval)用於重複調用函數。 –