我認爲最好的辦法是繼續使用標準的事件與$emit()
和$broadcast()
發射。 從angualr 1.5開始,已經引入了一些新的鉤子和sintax,但在組件內部,您始終可以注入$rootScope
和$scope
,並處理任何事件,因爲您曾經使用過角度爲< 1.5。
模板:
<div ng-controller="parentController">
<div ng-repeat="someObject in mainModel.listOfObjects">
<someControl ng-model="someObject.foo"></someControl>
<custom-component ng-model="someObject.bar"></custom-component>
</div>
</div>
父控制器:
angular.controller('parentController', ['$scope', function($scope){
..
if(somethingHappend)
$scope.$broadcast('event.sample', {}); //down in the scope chain
})
組件:
angular.component('customComponent', {
bindings: {
ngModel: '<' //one-way binding
},
controller: MyCtrl
}
MyCtrl.$inject = ['$scope', '$rootScope'];
function MyCtrl('$scope', $rootScope){
..
$scope.$on('event.sample', function(evt, data){
//do your logic
}
}
另一種選擇如果你想檢查你的模型的變化(由其他父範圍做出,假設你的範圍變量是單向綁定),就是使用鉤子$doCheck
,它觸發每個摘要週期,而不是舊的手錶機制,你必須保存你的舊值,並將其與新的值進行比較。
var self = this;
var oldModel = angular.copy(self.ngModel);
self.$doCheck = function(){
if(self.model !== oldModel){
//do something
}
}
也許這將是有益的http://stackoverflow.com/questions/19623412/reacting-on-angular-events-in-a-directive-without- injecting-rootscope – boroboris