Jedną rzeczą, którą powinieneś wiedzieć jest to, że przedrostek $ odnosi się do metody kątowej, przedrostki $$ odnoszą się do metod kątowych, których powinieneś unikać.
poniżej znajduje się przykładowy szablon i jego kontrolery. Zbadamy, w jaki sposób $ broadcast / $ on może pomóc nam osiągnąć to, czego chcemy.
<div ng-controller="FirstCtrl">
<input ng-model="name"/>
<button ng-click="register()">Register </button>
</div>
<div ng-controller="SecondCtrl">
Registered Name: <input ng-model="name"/>
</div>
Kontrolery są
app.controller('FirstCtrl', function($scope){
$scope.register = function(){
}
});
app.controller('SecondCtrl', function($scope){
});
Moje pytanie brzmi: w jaki sposób przekazujesz nazwę drugiemu kontrolerowi, gdy użytkownik kliknie rejestr? Możesz wymyślić wiele rozwiązań, ale tym, którego będziemy używać, jest użycie $ broadcast i $ on.
$ broadcast vs $ emit
Którego powinniśmy użyć? $ broadcast prześle kanał do wszystkich elementów domena potomnego, a $ emit skieruje kanał w przeciwnym kierunku do wszystkich elementów przodka.
Najlepszym sposobem uniknięcia decyzji między $ emit lub $ broadcast jest kanał z $ rootScope i użycie $ broadcast do wszystkich jego dzieci. Co znacznie ułatwia naszą sprawę, ponieważ elementami domowymi są rodzeństwo.
Dodanie $ rootScope i pozwala na emisję $
app.controller('FirstCtrl', function($rootScope, $scope){
$scope.register = function(){
$rootScope.$broadcast('BOOM!', $scope.name)
}
});
Zauważ, że dodaliśmy $ rootScope i teraz używamy $ broadcast (broadcastName, argumenty). Dla broadcastName chcemy nadać mu unikalną nazwę, abyśmy mogli złapać tę nazwę w naszym secondCtrl. Wybrałem BOOM! dla żartu. Drugi argument „argumenty” pozwala nam przekazywać wartości do słuchaczy.
Odbieranie naszej transmisji
W naszym drugim kontrolerze musimy skonfigurować kod, aby słuchać naszej transmisji
app.controller('SecondCtrl', function($scope){
$scope.$on('BOOM!', function(events, args){
console.log(args);
$scope.name = args; //now we've registered!
})
});
To naprawdę takie proste. Przykład na żywo
Inne sposoby osiągnięcia podobnych wyników
Staraj się unikać korzystania z tego zestawu metod, ponieważ nie jest on ani wydajny, ani łatwy w utrzymaniu, ale jest to prosty sposób na rozwiązanie problemów, które możesz mieć.
Zwykle możesz zrobić to samo, korzystając z usługi lub upraszczając kontrolery. Nie będziemy omawiać tego szczegółowo, ale pomyślałem, że po prostu wspomnę o tym dla kompletności.
Na koniec, pamiętaj, że naprawdę użytecznym przekazem do słuchania jest „$ destroy” ponownie, możesz zobaczyć, że $ oznacza, że jest to metoda lub obiekt utworzony przez kody dostawcy. W każdym razie $ zniszczenie jest emitowane, gdy kontroler zostanie zniszczony, możesz tego słuchać, aby wiedzieć, kiedy kontroler zostanie usunięty.