这是我的页面结构。
// 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指令中,我有一个控制器,它需要将数据传递给头组件。正如您所看到的,ng视图并没有以某种方式与头组件相关联。
假设ng视图控制现在的屏幕是:
// 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事件。
详细解释
$rootScope.$emit
只允许其他$rootScope
侦听器捕获它。当你不希望每个$scope都能捕获它时,这很好。大多数情况下是高级通信。把它想象成成年人在一个房间里互相交谈,这样孩子们就听不见了。
$rootScope.$broadcast
是一种让几乎所有人都能听到的方法。这相当于父母大喊晚餐已经准备好了,所以家里的每个人都能听见。
$scope.$emit
是希望$scope
及其所有父级和$rootScope
听到事件的时间。这是一个孩子在家里向父母抱怨(但不是在其他孩子能听到的杂货店(。
CCD_ 8用于CCD_ 9本身及其子代。这是一个孩子对着毛绒玩具窃窃私语,这样他们的父母就听不见了。