2013-09-02 9 views
6

Podczas oglądania wideo z jajkiem, ten o numerze Directive to directive communication sugeruje, że używamy kontrolera do dodawania funkcji do "tego" obiektu i uzyskiwania dostępu do niego z innych dyrektyw.

pełny kod użyty w filmie: Adding functions to this object

Odpowiedni kod kontrolera jest następująca:

controller: function($scope){ 
     $scope.abilities = []; 
     this.addStrength = function(){ 
      $scope.abilities.push("Strength"); 
     } 

     this.addSpeed = function(){ 
      $scope.abilities.push("Speed"); 
     } 

     this.addFlight = function(){ 
      $scope.abilities.push("Flight"); 
     } 
    }, 

Zastanawiałem się, zamiast dodawać funkcje do „to” dlaczego nie dodać go do $ zakres, szczególnie gdy używamy izolowanego zakresu?

Kod dodanie funkcji do $ zakresie: Adding functions to $scope

Odpowiedni kod sterownika jest w następujący sposób:

controller: function($scope){ 
     $scope.abilities = []; 
     $scope.addStrength = function(){ 
      $scope.abilities.push("Strength"); 
     }; 

     $scope.addSpeed = function(){ 
      $scope.abilities.push("Speed"); 
     }; 

     $scope.addFlight = function(){ 
      $scope.abilities.push("Flight"); 
     }; 
    }, 

Albo dlaczego mają funkcję kontrolera w ogóle. Dlaczego nie możemy skorzystać z funkcji łącza, aby osiągnąć ten sam rezultat?

Dodawanie funkcji do $ zakres w funkcji Link: Using link funtciont instead of controller

odpowiednia funkcja kontrolera i łącza jest następująca:

controller: function($scope){ 
     $scope.abilities = []; 
     $scope.addStrength = function(){ 
      $scope.abilities.push("Strength"); 
     }; 

     $scope.addSpeed = function(){ 
      $scope.abilities.push("Speed"); 
     }; 

     $scope.addFlight = function(){ 
      $scope.abilities.push("Flight"); 
     }; 
    }, 

Jestem całkiem pewien, że istnieje ważny powód, aby korzystać z kontrolera i tego obiektu . Nie jestem w stanie zrozumieć, dlaczego. Gdyby ktoś mógł wyjaśnić, że byłoby to pomocne.

Odpowiedz

4

Masz rację, że możesz może odsłonić funkcje w funkcji link i uzyskać takie same wyniki. Kontrolery kontrolne to trochę dziwny ptak, ale jak już pisałem bardziej skomplikowane dyrektywy, zdecydowałem się na popychanie w kontrolerach jak najwięcej zachowań i pozostawienie funkcji związanych z DOM w funkcji link. Powód:

  • Mogę podać nazwę kontrolera zamiast funkcji w mojej dyrektywie; rzeczy stają się czystsze IMO
  • Kontrolery mogą udostępniać publiczne interfejsy API używane w rodzeństwie lub pokrewnych dyrektywach, dzięki czemu można mieć pewne współdziałanie i zachęcać do SoC.
  • Możesz wyizolować testowanie kontrolera oprócz kompilacji dyrektywy, jeśli chcesz.

Zwykle wprowadzam kontrolerów tylko wtedy, gdy są możliwe złożone przejścia między stanami, przetwarzanie zasobów zewnętrznych (np. $ Http) lub ponowne użycie jest problemem.

Należy zauważyć, że Angular 1.2 ujawnia "kontroler" w dyrektywach, które pozwalają bezpośrednio spożywać kontroler w szablonach dyrektyw i zmniejszyć nieco ceremonię, jaką wprowadza kompozycja $ scope.

Powiązane problemy