2014-04-15 56 views
0

我正在玩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); 
      }); 
     } 
    } 
}]); 

現在,由於這兩種方法似乎都需要一個層次的指令,我會說第二個更好,因爲我不注入calendarCtrlday。但這一切都可以通過事件解決,我猜require不存在。所以我的問題是:是這兩種方法之一明顯優於其他方法嗎?我應該什麼時候選擇第一個(或反之),爲什麼?

+0

這個問題太主觀了......還有其他的方法可以做到這一點,其中'恕我直言'更好。例如,您可以使用服務來封送父母/子女之間的通信。 – Nix

+0

@Nix,服務已經在那裏! ('Calendar.setCurrent')。但爲了直接調用該方法,應該在''day'指令中注入'Calendar'。恕我直言,從設計的角度來看''日'應該無法訪問整個'日曆'。 – link

回答

0

我想了幾天。由於它沒有引發討論,我發佈了我自己的答案。

1)身高:REQUIRE,當你有需要傳達指令的一個固定的層次結構。

實施例:

<accordion-group> 
    <accordion></accordion> 
    <accordion></accordion> 
</accordion-group> 

在這種情況下,當accordion是開放的,它可以利用在accordionGroup控制器的一個方法以關閉所有其他。

2)身高:活動當你需要傳達的東西已經從一個指令發生,但你不知道什麼會需要對事件作出反應。