我正在編寫我的第一個AngularJS應用程序,並試圖獲得一個指令來更新它從服務中收到的數組更改視圖。
我的指令是這樣的:
angular.module('Aristotle').directive('ariNotificationCenter', function (Notifications) {
return {
replace: true,
restrict: 'E',
templateUrl: 'partials/ariNotificationCenter.html',
controller: function ($scope) {
$scope.notifications = Notifications.getNotifications();
$scope.countUnread = function() {
return Notifications.countUnread();
};
}
};
});
的部分是很簡單:
<p>Unread count: {{countUnread()}}</p>
雖然我Notifications
服務看起來是這樣的:
function Notification (text, link) {
this.text = text;
this.link = link;
this.read = false;
}
var Notifications = {
_notifications: [],
getNotifications: function() {
return this._notifications;
},
countUnread: function() {
var unreadCount = 0;
$.each(this._notifications, function (i, notification) {
!notification.read && ++unreadCount;
});
return unreadCount;
},
addNotification: function (notification) {
this._notifications.push(notification);
}
};
// Simulate notifications being periodically added
setInterval(function() {
Notifications.addNotification(new Notification(
'Something happened!',
'/#/somewhere',
Math.random() > 0.5
));
}, 2000);
angular.module('Aristotle').factory('Notifications', function() {
return Notifications;
});
的getNotifications
函數返回引用數組,由更改調用addNotification
時設置爲。但是,獲取視圖更新的唯一方法是運行$scope.$apply()
,這很糟糕,因爲這會刪除Angular的所有自動操作方面。
我在做什麼錯?
謝謝。
我剛剛從這篇文章發現同一時間:http://jimhoskins.com/2012/12/17/angularjs-and-apply.html。非常感謝,Angular知道該範圍已被修改的唯一方法是讓它知道偵聽更新。 – 2015-04-06 05:31:20
是的,這是一篇優秀的文章。角度需要知道模型何時改變。它觀察一些觸發器來確定。這些觸發器包括遠程請求,間隔和超時請求,鍵盤和鼠標事件。 – Chandermani 2015-04-06 05:34:15