Angular2组件与路由器插座通信

时间:2016-01-18 09:49:28

标签: typescript angular

要么我没有得到模式,要么我的设计是错误的。

使用angular2-beta0,typescript

基本上我已经设置了一个非常基本的应用程序,其中一个根组件是一个控制主视图的路由器,然后在某些页面上我有一个子路由器来控制该组件上的子视图。

我似乎正在努力解决的问题是如何通过组件之间的通信来构建事物。由于应用程序目前以一种对我来说具有逻辑意义的方式进行排列,主要路径的视图没有任何共同点,在子路径视图中它们都共享相同的侧面导航和标题。我遇到的问题似乎是回传给子视图的父视图。似乎是孩子在路由器插座中它不能获得父组件的依赖性。我已经查看了自定义事件,但这些事件似乎只在绑定到模板时才起作用。唯一的另一种选择似乎是服务,但这对我来说似乎是理所当然的,我希望父组件能够控制子组件的状态。

任何一些示例代码......

@Component({
    selector: 'app'
})

@View({
    template: '<router-outlet></router-outlet>',
    directives: [ROUTER_DIRECTIVES]
})

@RouteConfig([
    { path: '/', as: 'Login', component: LoginForm },
    { path: '/main/...', as: 'Main', component: Main}
])

class App {

    constructor(private _router: Router) {
    }

}

bootstrap(App, [ROUTER_PROVIDERS, provide(APP_BASE_HREF, { useValue: '/' })]);


@Component({
    selector: 'main'
})

@View({
    templateUrl: '/client/main/main.html',
    directives: [ROUTER_DIRECTIVES, NgClass, Menu, Main]
})

@RouteConfig([
    { path: '/', as: 'Clear', component: StateClear },
    { path: '/offer', as: 'Offer', component: StateOffer }
])

export class Main {

    constructor(private _router: Router) {

    }

}

@Component({
    selector: 'state-clear'
})

@View({
    templateUrl: '/client/bookings/state-clear.html'
})

export class StateClear {

    constructor(main: Main) {

    }
}

我在DI中遇到的错误是......

EXCEPTION:无法解析StateClear的所有参数(未定义)。确保它们都有有效的类型或注释。

事件没有错误,因为我没有看到如何在模板外听。

1 个答案:

答案 0 :(得分:3)

所以你可能想做的不是将DI与父组件一起使用。

就像你在这里一样:

export class StateClear {

    constructor(main: Main) {

    }
}

您可能只想创建一个服务来处理您想要在路由/组件级别共享的数据。

@Injectable()
export class UserSettingsService {
  // Application wide settings/config should be instatiated here
  // with a call from OnInit we can set all of these values.
  constructor() { }

  public iId: number;
  public userName: string;
  public isLoggedIn: boolean;
  public firstName: string;
  public lastName: string;
  public permissions: string[];
  getUser(userName:string) {
    // with an AJAX request get user Auth.
    return Promise.resolve(api.getUserAuth(userName));
  }
}

此UserSettingsService现在可以作为应用程序级服务添加到您的引导程序中,然后可以传递到您想要与之共享的所有路由中。 dependency-injection-in-angular-2

bootstrap(App, [ROUTER_PROVIDERS, UserSettingsService, provide(APP_BASE_HREF, { useValue: '/' })]);

然后执行以下操作以访问组件中的数据。

@Component({
    selector: 'state-clear'
})

@View({
    templateUrl: '/client/bookings/state-clear.html'
})

export class StateClear {
    userName:string;
    userId:int;
    isLoggedIn:boolean;
    constructor(private _userSettings: UserSettingsService) {
         // Not that you would do this here again but just for an example that the data is retrievable here.
         this.userName = this._userSettings.userName;
         this.userId = this._userSettings.iId;
    }
}