2015-02-12 9 views
7

Rozważmy dwie zagnieżdżone dyrektyw z izolować zakresów:angularjs dyrektywa rodzic komunikować z dyrektywą dziecięcej

<dctv1> 
    <dctv2></dctv2> 
<dctv1> 

Jeśli chcę dctv2 rozmawiać dctv1 mam, mogą w opcji:

  1. może wymagał kontroler dctv1 w definicji dctv2 przy użyciu require:'^dctv1'
  2. Mogę nazwać wyrażenie w zakresie nadrzędnym z opakowaniem <dctv2 callParent="hello()"></dctv2> i scope:{callParent:'&'} Mogę również użyć $scope.$emit w dctv2, ale wtedy wszystkie nadrzędne zasięgi usłyszą komunikat.

Teraz chcę dctv1 rozmawiać dctv2.

  1. Jedynym sposobem mogę osiągnięcia tego jest użycie $scope.$broadcast, ale wtedy wszystkie dzieci będą słuchać.

Mówiąc tutaj mam na myśli wywołanie funkcji lub coś podobnego. Nie chcę ustawiać zegarków zatykających trawę.

Jak najlepiej wykonać dctv1 powiadomić o błędzie, co spowoduje, że będą luźne? Po prostu powinienem móc usunąć dctv2 bez błędów.

+0

Jeśli wybrałeś wydarzenia. Możesz wywołać preventDefault i stopPropagation. W rzeczywistości zdarzenie $ jest instancją zdarzenia jQuery. – Raulucco

Odpowiedz

0

Możesz nim zarządzać, używając identyfikatora dla każdego dziecka, które należy przekazać rodzicowi; rodzic roześle zdarzenie za pomocą tego identyfikatora: dziecko wykona czynność tylko wtedy, gdy identyfikator przekazany od rodzica jest jego własnością.

Bye

0

Jednym ze sposobów jest, aby na życzenie/fabryka, która będzie komunikować się ze sterownikami, które chcesz.

Na przykład, oto Fabryka getter/setter

.factory('factoryName', function() { 

    var something = "Hello"; 

    return { 

     get: function() { 
      return something; 
     }, 

     set: function (keyword) { 
      something = keyword; 
      return something ; 
     } 
    }; 

}]) 

A potem w swoich kontrolerów:

.controller('controllerOne', ['factoryName', function (factoryName) { 
    $scope.test = factoryName.get(); 
}]); 

.controller('controllerTwo', ['factoryName', function (factoryName) { 
    $scope.test = factoryName.get(); 
    $scope.clickThis = function (keyword) { 
     factoryName.set(keyword); 
    }; 
}]); 

Sugeruję czytania na to: Can one controller call another?

3

Weź zajrzyj do AngularJS NgModelController po kilka pomysłów.

Każda dyrektywa <dctv2> wymagałaby, aby <dvtv1> został wprowadzony przez kontroler. Następnie możesz dodać obiekty lub wywołania zwrotne do właściwości tego kontrolera i usunąć je po zniszczeniu <dctv2>.

<dvtv1> nie będzie bezpośrednio rozmawiać z dziećmi, ale wywoła zwrotne powiązanie z jego właściwościami.

Na przykład;

NgModelController ma $parsers i $formatters, które są tablicą wywołań funkcji. Wepchnij własne funkcje do tablicy, aby rozszerzyć zachowanie kontrolerów.

Po przeprowadzeniu sprawdzania poprawności danych wejściowych jest w zasadzie rozmowa z innymi dyrektywami za pośrednictwem tych właściwości.

+0

Obsługuję główną ideę wywołania zwrotnego (każda instancja dctv2 zarejestruje swój własny oddzwaniany), ale pozostawiłbym NgModelController na boku. – Benjamin

+0

@Benjamin, czy możesz rozwinąć swój pomysł dalej? –

+0

@ Wei-jye Po prostu nie sądzę, że "NgModelController" jest tutaj dobrym przykładem. Sugeruję użycie 'require: '^ dctv1'', aby uzyskać odniesienie do kontrolera nadrzędnego. Następnie zarejestruj się do tego rodzica ('dctv1.registerChild (self)'). Następnie dctv1 zna swoje dzieci i może z nimi współdziałać. – Benjamin

Powiązane problemy