2

Angular 1.5 的新组件路由器有没有办法保持在 ng-outlet 指令中呈现的兄弟组件?我想与兄弟列表视图并行显示详细信息视图。据我了解官方文档(https://docs.angularjs.org/guide/component-router)应该可以使用 $$router 并将其绑定到子组件。

这是我试图做的: http ://plnkr.co/edit/KzW8fLAxrte9jSg5jhEg?p=preview

<ng-outlet><crisis-detail $router="$$router"></crisis-detail>

关于这个绑定主题有类似的帖子:

Angular 1.5 组件 $router 绑定

4

1 回答 1

1

据我所知,Angular 1.5 组件路由器无法同时显示兄弟姐妹。

但是,解决方法是让兄弟姐妹成为真正的孩子,然后使用空组件显示默认的“无详细信息”路线。

解决方法:

首先,我们需要一些根组件来激活列表本身:

.component('listRoot', {
      template: '<ng-outlet></ng-outlet>', //just ng-outlet, to render List inside
      $routeConfig: [
          {path: '/...', name: 'ListRoot',component: 'list' }, 
      ]
 })

然后我们需要为 list、detail 和 noDetail 模式添加组件。

.component('list', {
  template: 'List  ...  <ng-outlet></ng-outlet>',
  $routeConfig: [
      {path: '/', name: 'List',component: 'noDetails', useAsDefault: true }, 
      {path: '/:id',name: 'Details',component: 'details'}
  ],
  bindings: {
    $router: '<'
  },
  controller: function () {
      var ctrl = this
      $routerOnActivate = function(route) {
          ctrl.router = this.$router;
      }
      this.goToDetails = function(id) {
          ctrl.$router.navigate(['Details', {id: id}])
      }
  }
})
.component('detail', {
  template: 'Details: <a ng-link="[\'List\']">Go Back</a>'
})
.component('noDetails', {
  template: '' //just empty template
})

访问父级:

此外,为了能够通知父级(在您的示例中 - 兄弟 Detail 组件将其 ID 告知列表,然后列表将其标记为已选择),您可以使用require组件选项,以便能够访问父组件范围。

.component('detail', {
  template: 'Details: <a ng-link="[\'List\']">Go Back</a>',
  require: {
      parent: '^list'
  },
  controller: {
      this.goBackWithNotify = function(data) {
          ctrl.parent.someParentComponentProperty = data;
      }
  }
})

用示例编辑plunker 。

PS:我使用了更新版本的路由器。

于 2017-02-08T07:32:23.090 回答