Это структура моей страницы.
// app.html
<wrapper ng-if="initialized && $root.user.type!='guest'">
<header-component></header-component>
<div class="app-body">
<sidebar-component></sidebar-component>
<main class="main-content" style="height:{{$root.pageHeight}}px; overflow-y: scroll">
<ng-view></ng-view>
</main>
<aside-component></aside-component>
</div>
</wrapper>
Теперь в директиве ng-view у меня есть контроллер, который должен передавать данные компоненту header.
Как видите, ng-view каким-то образом не связан с компонентом header.
Скажем, теперь экран управления ng-view:
// some-screen.js
$scope.foo = "bar";
И я хочу отобразить bar
в шапке.
Я могу сделать это как с $ rootScope (без какого-либо события), так и с помощью события $ broadcast.
Первый метод - использование $ rootScope - как есть - без всего:
// some-screen.js
$rootScope.foo = "bar";
// header.js
app.directive("headerComponent", ($rootScope) => {
return {
templateUrl: "/structure/header/header.html",
scope: {},
link: function($scope, element, attrs) {
console.log($rootScope.foo) // "bar"
}
}
});
Второй метод - использование события $ broadcast
// some-screen.js
$rootScope.$emit("SomeNameOfTheEvent", $scope.foo);
// header.js
app.directive("headerComponent", ($rootScope) => {
return {
templateUrl: "/structure/header/header.html",
scope: {},
link: function($scope, element, attrs) {
$rootScope.$on("SomeNameOfTheEvent", function(event, info) {
console.log(info.foo) // "bar"
});
}
}
});
Теперь обратите внимание на две вещи при использовании события $ broadcast:
Вам нужно указать имя для этого события - в большом приложении это может быть сложно - так как
Вы, вероятно, не будете помнить имена, которые вы бросаете во время кодирования.
А сидеть и думать о хороших именах - пустая трата времени.
Вам, вероятно, нужно будет сделать документацию, чтобы повторно использовать имя события из других мест
в приложении - в противном случае вы по ошибке попытаетесь использовать то же событие, но с неправильными именами.
Они оба делают одно и то же - $ broadcast просто требует больше кода для работы.
Что мне не хватает, возможно, AngularJS создал событие $ broadcast для чего-то.