如何将子路由器注入对话框视图模型

时间:2016-11-08 20:26:15

标签: aurelia aurelia-router aurelia-dialog

在我们的项目中,我们有许多这样的自定义元素:

<entity-link id="entity.id>

基本上它只是渲染一个链接来编辑实体屏幕

<template>
    <a class="entity-link"
       route-href="route: ENTITY_EDIT; params.bind: { id: entity.id }"
            >${entity.name}
    </a>
</template>

问题是这在Aurelia Dialog上下文中根本不起作用。 归因于href归因于此。

我试图调查这个问题,我将路由器直接注入对话框的视图模型

import {Router} from 'aurelia-router';
@inject(DialogController, Router)
export default class RecordDetailsDialog {
constructor(dialogController:DialogController, router:Router) {
        this.controller = dialogController;
        this.router = router;     /// WRONG INSTANCE!!!
    }
}

并找出正在注入的错误路由器实例。 主路由器(AppRouter)没有定义ENTITY_EDIT路由,它在子路由configureRoute函数中动态添加。

我不明白为什么注入的路由器是主路由器而不是传递给视图的路由器启动对话框打开。

请提出任何建议

1 个答案:

答案 0 :(得分:0)

所以经过2个小时的阅读aurelia的源代码后,我发现DialogService实例是在根DI容器中创建的,该根容器与根路由器关联,后者不知道子路由。 我通过在Child视图模型容器

中手动注册DialogService实例来解决我们的问题
  import {Container} from 'aurelia-dependency-injection';
  import {CompositionEngine} from 'aurelia-templating';
  import {DialogService} from 'aurelia-dialog';

  export class Main {

  constructor(container:Container, compositionEngine:CompositionEngine){
    container.registerInstance(DialogService, new DialogService(container,   compositionEngine))`
  }
     ...
  } 

但它感觉很乱,仍然想知道是否有更简洁的方法来解决问题。