【发布时间】:2018-11-04 09:39:18
【问题描述】:
这是我的页面结构。
// 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-view 在某种程度上与 header-component 没有关联。
假设 ng-view controll now screen 是:
// 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 事件。
【问题讨论】:
-
你说“想个好名字是浪费时间”。这是一个短视的观点。无论是事件名称还是变量名称,考虑好名称都会使代码更易于理解、调试、测试和维护。好名字可以节省代码生命周期的时间。
标签: javascript angularjs events single-page-application