Angular 1.5父子组件问题

时间:2016-06-03 14:50:41

标签: angularjs angular-component-router ngcomponentrouter

我正在使用Angular 1.5 Component路由器,并且无法在父组件中获取可在子组件中访问的范围变量。我创建了一个plunker here来说明问题。我用这个视图创建了一个父组件:

    <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>

注意父组件视图中的“search”变量。我希望子组件可以访问它,但它对我不起作用。我已经看到了一些示例,它们显示了父组件中直接引用的子组件,如下所示:

<application-grid search="$ctrl.search"></application-grid>

但是,这不是打败ng-outlet的目的吗?我不认为我应该像这样手动将参数传递给子组件吗?这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

偶然发现了这一点 - 希望你找到解决方案,但如果不是这样的话。 您可以使用require属性轻松地使用它。

只需将此添加到您的子组件设置和宾果:

require: {
   parent: '^app'
}

然后访问父作用域对象do $ ctrl.parent.search。

请注意,您不必将其称为父级 - 它可以是您喜欢的名称。

我已经把你的傻瓜分开了 - 看它工作http://plnkr.co/edit/epPg2xWY6IYJN2Fnvg61

答案 1 :(得分:0)

您可以通过$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() 创建的组件始终具有隔离范围 - 即,您无法从其中的父范围访问范围变量。必须通过路由器或绑定明确传递它们。

有关更多信息,您应该查看Component Router section of the Angular developer guide - 新路由器的文档非常稀疏,但该指南很好地解释了它的工作原理。