【问题标题】:Angular2 Routing - Passing data from parent component to a sub-child componentAngular2 路由 - 将数据从父组件传递到子子组件
【发布时间】:2016-08-28 02:02:25
【问题描述】:

我正在尝试将一个简单的字符串对象从父组件传递给子子组件。我尝试过以下方式:

parent.ts

import {Component} from 'angular2/core';
import {Router,ROUTER_DIRECTIVES,ROUTER_PROVIDERS,RouteConfig} from 'angular2/router';
import {ChildCmp} from "./child";
import {bootstrap} from 'angular2/platform/browser';

@Component({
    selector: 'app',
    template:`
    <router-outlet></router-outlet>
    `,
    directives: [ROUTER_DIRECTIVES]
})
export class ParentCmp{
    public data = "Some data from parent.";
    constructor (private _router:Router){
        var config = [];
        if(!this._router.registry.hasRoute("Child",ParentCmp))
            config.push({path: "/child/...",component:ChildCmp,name: 'Child',useAsDefault:true, data: {"data": this.data}});

        this._router.config(config);
    }
}

bootstrap(ParentCmp,[
    ROUTER_PROVIDERS
]);

child.ts

import {Component} from 'angular2/core';
import {RouteData,Router,ROUTER_DIRECTIVES,RouteConfig} from 'angular2/router';
import {SubChildCmp} from "./sub_child";

@Component({
    selector: 'child',
    template: `<router-outlet></router-outlet>`,
    directives: [ROUTER_DIRECTIVES]
})
@RouteConfig([

])
export class ChildCmp{
    public data:Object;
    constructor(private _data:RouteData,private _router:Router){

        this.data = this._data.get("data");

        var config = [];
        if(!this._router.registry.hasRoute("SubChild",ChildCmp))
            config.push({path:"/sub_child",component: SubChildCmp,name:"SubChild", useAsDefault:true, data:{"data":this.data}});

        this._router.config(config);
    }
}

sub_child.ts

import {Component} from 'angular2/core';
import {RouteData} from 'angular2/router';

@Component({
    selector: "sub-child",
    template: `Data from parent is -->
    {{data}}
    `
})
export class SubChildCmp{
    public data:Object;

    constructor(private _data:RouteData){

        this.data = this._data.get("data");
    }
}

但是我得到一个空白页。 child.ts 中的路由配置似乎没有正确配置。我怎样才能做到这一点?我只想将一些数据从parent 组件传递给sub-child 组件。我重新生成了问题here on plunker

【问题讨论】:

    标签: javascript routing angular


    【解决方案1】:

    这个用例通常使用一个服务

    @Injectable
    export class SharedData {
      data;
    }
    
    @Component({
        selector: 'app',
        providers: [SharedData],
        template:`
        <router-outlet></router-outlet>
        `,
        directives: [ROUTER_DIRECTIVES]
    })
    export class ParentCmp{
        public data = "Some data from parent.";
        constructor (private _router:Router, private _sharedData:SharedData){
            var config = [];
            if(!this._router.registry.hasRoute("Child",ParentCmp))
                _sharedData.data = this.data;
            }
        }
    }
    
    export class SubChildCmp{
        public data:Object;
    
        constructor(_sharedData:SharedData){
    
            this.data = _sharedData.data;
        }
    }
    

    如果存在时间问题,例如当SubChildCmpParentCmp 设置值之前读取值时,可能需要将ObservableBehaviorSubjectsubscribe() 一起使用。

    更多详情见https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#bidirectional-service

    【讨论】:

    • 谢谢。感谢您的帮助。
    猜你喜欢
    • 2016-09-05
    • 1970-01-01
    • 2016-12-16
    • 2016-12-08
    • 1970-01-01
    • 2017-05-07
    • 2019-02-27
    • 2017-04-20
    相关资源
    最近更新 更多