我正在使用 Angular 1.5 组件路由器,但在子组件中无法访问父级中的范围变量时遇到问题。 我在这里创建了一个 plunker 来说明这个问题。 我使用此视图创建了一个父组件:
<nav>
<ul class="linkList">
<li><a ng-class="{selected: $ctrl.isSelected('Applications')}" ng-link="['Applications', {search:$ctrl.search}]">Applications</a></li>
<li><a ng-class="{selected: $ctrl.isSelected('Processes')}" ng-link="['Processes']">Processes</a></li>
<li><a ng-class="{selected: $ctrl.isSelected('Tasks')}" ng-link="['Tasks']">Tasks</a></li>
<li><a ng-class="{selected: $ctrl.isSelected('Resources')}" ng-link="['Resources']">Resources</a></li>
</ul>
<div class="filter">
Filter: <input type="search" ng-model="$ctrl.search" />
</div>
<div class="clear"></div>
</nav>
<ng-outlet></ng-outlet>
请注意父组件视图中的"搜索"变量。 我希望子组件可以访问它,但它对我不起作用。 我见过一些示例,这些示例显示子组件在父组件中直接引用,如下所示:
<application-grid search="$ctrl.search"></application-grid>
然而,这难道不是违背了ng-outlet的目的吗? 我认为我不应该像这样手动将参数传递给子组件,对吗? 正确的方法是什么?
只是偶然发现了这个 - 希望你找到了解决方案,但如果不在这里。您可以使用 require 属性轻松使其工作。
只需将其添加到您的子组件设置和宾果游戏中:
require: {
parent: '^app'
}
然后,要访问父范围对象,请执行$ctrl.parent.search。
请注意,您不必称其为父级 - 它可以是您喜欢的任何名称。
我已经分叉了你的 plunkr - 看到它工作 http://plnkr.co/edit/epPg2xWY6IYJN2Fnvg61
您可以通过$routerOnActivate
生命周期挂钩访问路由参数,当路由转换到该组件时会自动调用该挂钩。以下是 Angular 文档中的示例:
function HeroDetailComponent(heroService) {
var $ctrl = this;
this.$routerOnActivate = function(next, previous) {
// Get the hero identified by the route parameter
var id = next.params.id;
return heroService.getHero(id).then(function(hero) {
$ctrl.hero = hero;
});
};
...
此外,值得注意的是,使用 angular.module().component()
创建的组件始终具有隔离作用域 - 即,您不能从其中的父作用域访问作用域变量。它们必须通过路由器或绑定显式向下传递。
有关更多信息,您应该查看 Angular 开发人员指南的组件路由器部分 - 新路由器的文档非常稀少,但该指南很好地解释了它是如何工作的。