问题 如何将数据从路由器组件传递到Aurelia中的子组件?


假设我们在Aurelia中有一个名为UserRouter的组件,它是一个子路由器,处理到UserProfile,UserImages和UserFriends的路由。

我希望UserRouter从API(在canActivate上)加载用户,然后将此用户数据传递给子组件。

加载数据很好,如何将其传递给子组件,以便他们都可以读取它?例如放置属性 <router-view>

我已经在子组件的bind()方法上尝试了bindingContext参数,但是这没有用。

谢谢


6527
2018-05-25 21:43


起源

您是否考虑过使用共享状态? - Matt McCabe
查看Patrick Walters的 关于分享和传递国家的帖子 - Matt McCabe


答案:


我这样做的方法是在子路由器定义中添加附加信息,例如:

configureRouter(config, router){
   config.map([
  { route: [''], name: 'empty', moduleId: './empty', nav: false, msg:"choose application from the left" },
  { route: 'ApplicationDetail/:id',  name: 'applicationDetail',   moduleId: './applicationDetail', nav: false, getPickLists : () => { return this.getPickLists()}, notifyHandler : ()=>{return this.updateHandler()} }
]);

在这个例子的第一个路径中,我通过将自己的属性'msg'添加到路由对象来传递文本消息。 在第二个路径中,我传递了一些事件处理程序,但可能是一些自定义对象或其他东西。

在childmodel中,我在activate()方法中接收了这些附加元素:

export class empty{
  message;

  activate(params, routeconfig){
    this.message=routeconfig.msg || "";
  }
}

我想在你的情况下,你会将用户对象添加到子路由器定义。


6
2017-07-16 22:17



在这种情况下,我们怎样才能使getPickLists双向绑定,我的意思是在子路由中的picklist中的任何变化都可以反映在父节点中? - Manoj Shevate


您可以将路由器/用户对象绑定到 <router-view>

<router-view router.bind="router"></router-view>

我有同样的问题,所以我很想看看你想出了什么!


3
2017-07-15 08:04





你可以使用 事件聚合器 发布带有数据的事件,子组件可以订阅和监听该事件。这样可以避免它们之间的耦合。但是,我可能没有想到的缺点。


2
2018-06-10 18:36



或使用arelia-flux,这或多或少是相同的东西,但有点整洁imho - Painy James


我为此制定了一个解决方案,您只需告诉依赖注入器使用Parent.of(YourComponent)注入父路由器组件的实例。

import {inject, Parent} from 'aurelia-framework';
import {UsersRouter} from './router';

@inject(Parent.of(UsersRouter))
export class UserImages {
  constructor(usersRouter) {
      this.usersRouter = usersRouter;
  }

  activate() {
    this.user = this.usersRouter.user;
  }
}

您实际上也可能错过了Parent.of部分,因为Aurelia DI系统正常运行。

import {inject} from 'aurelia-framework';
import {UsersRouter} from './router';

@inject(UsersRouter)
export class UserImages {
  constructor(usersRouter) {
      this.usersRouter = usersRouter;
  }

  activate() {
    this.user = this.usersRouter.user;
  }
}

1
2018-05-26 20:46



如果你离开,要小心 UsersRouter 然后导航回来,你可能得到旧的路由器,而不是新的路由器,因为 UsersRouter 可以将依赖注入为静态生命周期类,这意味着实例化的第一个是将在各处注入依赖关系的类。 - Micah Zoltu


您可以实现一个通用方法来传递对象:

configureRouter(config, router){
    this.router = router;
    ...

    this.router.navigateWithParams = (routeName, params) => {
        let routerParams = this.router.routes.find(x => x.name === routeName);
        routerParams.data = params;
        this.router.navigate(routeName);
    }

}

然后你可以编程使用它像:

goToSomePage(){
     let obj = { someValue: "some data", anotherValue: 150.44}
     this.router.navigateWithParams("someRoute", obj );
}

最后,您可以在目标页面上获取参数:

 activate(urlParams, routerParams)
 {
      this.paramsFromRouter = routerParams.data;
 }

0
2017-07-12 03:34



看起来方法名称改变了this.router.navigateToRoute('someRoute'',obj); - Aligned