【问题标题】:How to inject an indirect ancestor component in Angular2如何在Angular2中注入间接祖先组件
【发布时间】:2016-08-24 14:16:01
【问题描述】:

在 Angular2 中,只需使用以下语法,就可以将父组件甚至祖先(例如祖父母)组件注入子组件:

export class Grandchild {
   constructor( @Optional() @Host() @Inject(forwardRef(() => Ancestor)) ancestor)
}

但是,这似乎只适用于在单个模板中定义的祖先-孙子关系,如下所示:

<!-- App component template -->
<ancestor>
  <foobar>
    <grandchild></grandchild>  <!-- injection works -->
  </foobar>
</ancestor>

如果我们的模板如下所示,则注入将不起作用:

<!-- App component template -->
<ancestor>
  <foobar></foobar>
</ancestor>

<!-- Foobar component template -->
<grandchild></grandchild>  <!-- injection doesn't work -->

我为此做了一个 plunker:http://plnkr.co/edit/D9iSokONIAFAS8G1NTd1

【问题讨论】:

  • 我认为不支持。
  • 我希望不是这样,但如果是这样,那么我认为我应该向 Angular2 提交错误报告。
  • 据我所知,只有直接父母可以被注入。您可以在祖父母处提供可由任何后代注入的服务。我很确定错误报告是多余的。
  • 使用祖父母提供的服务的想法可能是关键。尽管“可选”部分存在问题,但可以通过另一个 hack 来克服。也许您应该修改您的评论作为答案?

标签: angular parent inject ancestor


【解决方案1】:

您可以提供共享服务并使用它进行通信。

@Injectable()
class SharedService {
  grandParent = new BehaviorSubject();
}

@Component({
  selector: 'grand-parent',
  providers: [SharedService],
  ...
})
class GrandParent {
  constructor(sharedService:SharedService) {
    sharedService.grandParent.next(this);
  }
}

@Component({
  selector: 'descendant',
  providers: [],
  ...
})
class Descendant {
  constructor(@Optional() sharedService:SharedService) {
    if(sharedService) {
      sharedService.grandParent.subscribe(grandParent => this.grandParent = grandParent);
    }
  }
}

实际上,我不会发送对 this 的引用,而是使用 observables 来发送接收者操作的消息。

【讨论】:

  • 好答案。缺少的“@Optional”功能可以通过为“SharedService”使用虚拟应用程序级提供程序来实现,唯一的区别是对“祖父母”的引用是未定义的。我的特殊用例是创建可以独立操作(内联编辑)或作为自定义表单的一部分(传统编辑)的自定义内联编辑字段。在这种特殊情况下,我认为我将使用从输入(子)到可选表单(祖先)组件的直接引用,而不是可观察对象,尽管可观察对象通常是推荐的解决方案。
  • 不确定“缺少@Optional 功能”是什么意思。这也可以与服务一起使用。
  • 我的意思是您需要始终有一个服务提供商。如果您碰巧使用了没有“祖先”的“子”(因此祖先是可选的),您需要在应用程序级别提供该共享服务,以防止 Angular2 崩溃。如果你考虑一个 HTML 等价物,你可以在没有
    元素的情况下使用 元素,但是如果你碰巧在
    中有 元素,它们的值将在
    时发送> 已提交。因此
    的可选祖先,提供额外的功能。
  • 但这正是 @Optional() 装饰器所做的。如果 DI 找不到提供程序,它会传递 null 而不是崩溃。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-19
相关资源
最近更新 更多