首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在角2中向子注入更高的父组件(而不是直接父)。

在角2中向子注入更高的父组件(而不是直接父)。
EN

Stack Overflow用户
提问于 2017-01-03 23:41:04
回答 2查看 2.5K关注 0票数 1

我需要注入一个不是直接父组件的父组件。

@Host()装饰器只允许注入直接父组件。

实际例子-菜单和菜单项组件。我想把菜单放在页面上

代码语言:javascript
复制
<menu [name]="'smth'">
  <auth-logout></auth-logout>
  <!-- ... other menu items -->
</menu>

name输入调用菜单上的操作(e.x )。切换)通过菜单服务。任何菜单项子组件都可以包含menu-item组件。

代码语言:javascript
复制
<menu-item (itemClick)="logout()">
  LOGOUT
</menu-item>

menu-item模板

代码语言:javascript
复制
<div class="menu-item"    
     (click)="onClick()">
  <ng-content></ng-content>
</div>

plnkr http://plnkr.co/edit/ArQZYZsHQgn6I2eK3AZd

我希望将menu组件注入到menu-item中,以调用menu-item单击事件上的close()方法。auth-logout不应该知道这个菜单-组件交互,我不想重复每个菜单项的逻辑。

为什么不像这样包装呢?

代码语言:javascript
复制
<menu>
  <menu-item>
    <auth-logout></auth-logout>
  </menu-item>
</menu>

因为menu-item块有一些样式可以打破对子组件(e.x )的正确单击。并且很难在单击时自动关闭菜单(需要将菜单名称传递给每个组件,如auth-logout或在此组件中添加输出)

为什么不使用来自menu-item的服务调用?因为它需要通过每个菜单项(如auth-logout)将菜单项传递给menu-item,但是像auth-logout这样的组件不应该知道这种交互或菜单名称或其他任何东西。

另一个例子-项目列表与某些项目子组件,它侦听列表更改事件(主题在列表组件),并做一些事情上发出(e.x。通过添加新的时间戳参数来重置缓存和更新映像)。通过服务传递列表名太复杂了,因为组件嵌套很深(页面上的不同列表需要名称)。

这种情况在ng1中运行良好,require属性允许将任何更高级别的父级注入组件。

更新:

上面的示例可以通过删除@Host()并在构造函数注入(thx @yurzui)中添加遗漏的private来修复。但真正的问题更复杂,这个解决方案没有帮助。这是最新的plnkr。http://plnkr.co/edit/p7Vd4FRpHPRtyEuL6pEZ

差异是添加了具有此模板的header-menu组件。

代码语言:javascript
复制
<menu>
  <ng-content></ng-content>
</menu>

并且将menu注入到menu-item组件中并不适用于此组件嵌套。

代码语言:javascript
复制
header-menu
  menu
    auth-logout
      menu-item

Update/Answer:header-menu的最后一个案例与这个问题有关,github.com/anged.com/ar角/ does /5126,这还不支持。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-04 06:49:14

只需删除@Host()装饰器,不要忘记private。否则,this.menuComponent将永远是undefined,无需修改private

代码语言:javascript
复制
constructor (@Optional() private menuComponent: MenuComponent)

柱塞实例

票数 3
EN

Stack Overflow用户

发布于 2017-01-04 03:03:43

这是修改过的普鲁克尔

这是一种向下传递实例的方法:使用模板参考变量

注射对我来说太复杂了。

在app.component.html中:

代码语言:javascript
复制
<menu #mm><!-- use whatever name after # -->
  <auth-logout [menu]='mm'></auth-logout>
</menu>

在auth-logout.Component.html中:

代码语言:javascript
复制
<menu-item (itemClick)="logout()" [menu]="menu">
  LOGOUT
</menu-item>

在auth-logout.Component.ts中:

代码语言:javascript
复制
@Input() menu: MenuComponent;

在菜单中-条目.组件. In:

代码语言:javascript
复制
@Input() menu: MenuComponent;

#mm(MenuComponent的实例)将作为menu传递到auth注销,然后以menu的形式传递到菜单项,然后在菜单项中调用menu.close()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41454069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档