我正在玩AngularJS指令。同時關注父母/孩子指示之間的互動。我偶然發現了兩種不同的方法,我想知道哪一種更好。讓我以一個例子來解釋:指令交互:要求與事件
假設我們有一個calendar
指令。該指令與Calendar
模型進行交互,該模型包含當前顯示日期的模型和其他信息,例如日曆中當前選定的日期。此外,在指令的模板中,我們有一個day
指令列表,每個模型中有一個指令。現在
<calendar>
<day ng-repeat="day in Calendar.days"></day>
</calendar>
,假設我們想點擊一個白天和選定日期更改Calendar
模型。
方法1:日曆範圍和使用SET方法REQUIRE
myApp.directive('calendar', ['Calendar', function(Calendar){
return {
...,
controller: function($scope, $element, $attrs){
this.setSelectedDay = function(day){
Calendar.setSelected(day);
}
}
}
}]);
myApp.directive('day', [function(){
return {
...,
require: '^calendar',
controller: function($scope, $element, $attrs, calendarCtrl){
$element.on('click', function(){
calendarCtrl.setSelectedDay($scope.day);
})
}
}
}]);
方法2:放出事件從白天
myApp.directive('calendar', ['Calendar', function(Calendar){
return {
...,
controller: function($scope, $element, $attrs){
$scope.$on('daySelected', function(event, arg){
//this call should be wrapped in $scope.$apply
Calendar.setSelected(arg);
})
}
}
}]);
myApp.directive('day', [function(){
return {
...,
link: function postLink($scope, $element, $attrs) {
$element.on('click', function() {
//tell to my parents 'I have been clicked!'
$scope.$emit('daySelected', $scope.day);
});
}
}
}]);
現在,由於這兩種方法似乎都需要一個層次的指令,我會說第二個更好,因爲我不注入calendarCtrl
在day
。但這一切都可以通過事件解決,我猜require
不存在。所以我的問題是:是這兩種方法之一明顯優於其他方法嗎?我應該什麼時候選擇第一個(或反之),爲什麼?
這個問題太主觀了......還有其他的方法可以做到這一點,其中'恕我直言'更好。例如,您可以使用服務來封送父母/子女之間的通信。 – Nix
@Nix,服務已經在那裏! ('Calendar.setCurrent')。但爲了直接調用該方法,應該在''day'指令中注入'Calendar'。恕我直言,從設計的角度來看''日'應該無法訪問整個'日曆'。 – link