- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试构建这个:
┌--------------------------------------------┐
| -Page 1- -Page 2- -Page 3- |
├----------┬---------------------------------┤
| Link 1 | <router-outlet></router-outlet> |
| Link 2 | |
| Link 3 | |
| | |
| | |
左侧的链接列表取决于页面。
一个典型的页面是这样的:
<div>
<app-component-1 appAnchor anchorTitle="Link 1"></app-component-1>
<app-component-2 appAnchor anchorTitle="Link 2"></app-component-2>
<app-component-3 appAnchor anchorTitle="Link 3"></app-component-3>
</div>
有一些指令 appAnchor
关联到 @Input() anchorTitle: string
。我想自动捕获它们并更新左侧菜单。
当我尝试通过 router-outlet
查询这些元素时,问题就来了。
所以我尝试了:
@ViewChildren(AnchorDirective)
viewChildren: QueryList<AnchorDirective>;
@ContentChildren(AnchorDirective)
contentChildren: QueryList<AnchorDirective>;
ngAfterContentInit(): void {
console.log(`AppComponent[l.81] contentChildren`, this.contentChildren);
}
ngAfterViewInit(): void {
console.log(`AppComponent[l.85] viewChildren`, this.viewChildren);
}
但我总是得到一些空的 QueryList
:
QueryList {dirty: false, _results: Array(0), changes: EventEmitter, length: 0, last: undefined, …}
我也试过:
@ContentChildren(AnchorDirective, {descendants: true})
@ContentChildren(AnchorDirective, {descendants: false})
最后,我尝试在最后一刻查询元素:
<router-outlet (activate)="foo()"></router-outlet>
注意:我不希望子组件通过服务向父组件发送数据,因为它会导致一些 ExpressionChangedAfterItHasBeenCheckedError
和 is considered as a bad practice .我真的更愿意直接从父组件查询链接。
编辑:这是一个stackBlitz显示问题。如果在组件内部使用了 @ViewChildren
,则一切正常。但是,如果从根组件使用 @ViewChildren
,则会失败。
最佳答案
正在进行讨论 here关于 ContentChildren
的工作原理,它与您的问题密切相关。
并且在 this comment据解释:
In Angular content projection and queries it means "content as it was written in a template" and not "content as visible in the DOM"
和
The consequence of this mental model is that Angular only looks at the nodes that are children in a template (and not children in the rendered DOM).
与上述问题类似,通过 router-outlet
激活的组件不被视为 ViewChildren
或 ContentChildren
。它们只是 DOM 子级,这并不意味着在 View 和内容查询方面有任何 Angular 。没有办法(截至今天)使用 ViewChild
或 ViewChildren
或 ContentChild
或 ContentChildren
查询它们
我的建议是结合使用 activate
事件和 RouterOutlet 的 component
属性来解决您的问题。以实现所需的行为。因此:
定义router-outlet如下:
<router-outlet #myRouterOutlet="outlet" (activate)='onActivate()'></router-outlet>
并按如下方式使用它:
@ViewChild("myRouterOutlet", { static: true }) routerOutlet: RouterOutlet;
nbViewChildren: number;
links = [];
onActivate(): void {
setTimeout(() => {
const ancList: QueryList<AnchorDirective> = (this.routerOutlet.component as any).children;
this.nbViewChildren = ancList.length;
this.links = ancList.map(anc => anc.anchorTitle);
})
}
这是一个改进了打字的工作演示:https://stackblitz.com/edit/angular-lopyp1
另请注意,setTimeout
是必需的,因为 onActivate
在组件生命周期尚未开始或完成的路由期间被触发。 setTimeout
确保组件生命周期已完成,并且组件和底层查询也已准备就绪。
关于angular - 结合使用 @ViewChildren/@ContentChildren 和 router-outlet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56955317/
您好,我目前正在构建一个表,该表将允许其中包含多种列类型。我希望能够像这样使用它: text-column和 icon-column是单独的指令。 我目前有一个名为 col
我一直在寻找 Angular 的文档和源代码,但到目前为止一无所获。 import { ContentChildren, QueryList } from '@angular/core'; i
我正在尝试使用 @ContentChildren 来获取所有带有 #buttonItem 标签的项目。 @ContentChildren('buttonItem', { descendants: tr
我有 3 个组件。 1 个父组件,可以将任何 2 个子组件之一包装在 ng-content 中。我的子组件具有共享功能,因此它们正在扩展具有共享功能的抽象类。 当我尝试使用 ContentChildr
我在 Angular 中有两个像这样的组件 @Component({ selector: 'content-com', template: '' })
我有三个组件:App、Parent 和 Child: 应用组件 @Component({ selector: 'app', directives: [Parent,Child],
我正在尝试创建一个通用的幻灯片组件,它将采用多个组件,然后它会根据特定的用户操作循环播放。 它与 Angular Material 的 stepper component 非常相似. 到目前为止,我发
我想创建一个父指令,它根据子项的值显示或隐藏子项。为此,我采用了父结构指令和带有值的子指令的方法。为简单起见,没有值: 1 2 3 4 要访问 child ,我在父指令中使用以下行
我有一个名为“VerticalTabsDirective”的指令,具有属性- @ContentChildren(MatTabLink) contentChildren: QueryList; @Inp
我正在尝试获取 ng-template 和 input 参数的 TemplateRef。 应用程序组件.html: {{dataItem|json}} 问题是我
contentChildren 与其“父级”之间通信的首选方法是什么? 更新: child 可能不是直接 parent ... 给定一个随机的子列表,由一组包裹: Some other co
我知道您可以通过指定特定的组件类型来获取子组件 @ContentChildren(SpecificComponent)但我可以使用 @ContentChildren(SOMETHING)并获得一个组件
我正在尝试为具有子组件并使用 ng-content 注入(inject)的组件编写单元测试.我试图在我的测试中获取组件的查询列表,以便我可以在下面测试这个函数,但似乎无法填充 QueryList我的单
我的情况是我有一个包含 ng-content 的“项目”组件: @Component({ selector: 'items' template: `` }) 我想获取此内容的值,因此我使用 Con
我正在尝试在 Angular 中创建一个树组件,如下所示: @Component({ selector: 'app-tree', template: `
我正在尝试实现一个搜索组件,能够在特定子项上触发 search(term: string) 函数。如果对子项的搜索失败,此搜索函数将返回 null;如果成功,则返回对子项的引用。 之所以如此,是因为我
我有一个导航列表组件,它试图获取相同类型的子内容。 item1 Item 2 export clas
我有一个 ng1 应用程序,它使用 upgradeAdapter 引导并使用降级的 ng2 组件。 但是我遇到了@ContentChildren 装饰器的问题。似乎@ContentChildren 没
我想创建一个可以按如下方式使用的组件: Slide title Slide content (any html) Slide 2 title ...
我想在 Angular2 中使用 @ContentChildren 在向导中导航。但是当我使用它时,出现了这个错误:“zone.js?fad3:158 未捕获错误:由于未定义查询选择器,无法为“Ext
我是一名优秀的程序员,十分优秀!