#javascript #angular #angular-material #viewchildren
Вопрос:
Я рассмотрел довольно много других вопросов по SO, связанных с этой угловой функцией, и ни одно из решений, похоже, не помогает моему сценарию. Я использую компонент дерева угловых материалов и пытаюсь создать компонент в полностью развернутом узле.
Мой Tree.component.html
:
<ng-container class="tree-content">
<mat-card>
<mat-tree [dataSource]="dataSource" [treeControl]="treeControl">
<mat-tree-node *matTreeNodeDef="let node; when: hasChild" matTreeNodePadding>
<ng-container *ngIf="node.expandable">
<button mat-icon-button matTreeNodeToggle [attr.aria-label]="'Toggle ' node.name" (click)="generateTreeContent(node, treeControl.isExpanded(node))">
<mat-icon class="dark">
{{treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right'}}
</mat-icon>
</button>
<p>{{node.name}}</p>
</ng-container>
<app-dynamic></app-dynamic>
</mat-tree-node>
</mat-tree>
</mat-card>
</ng-container>
Мое ViewChildren
объявление декоратора в Tree.component.ts
:
@ViewChildren(DynamicComponent) children: QueryList<DynamicComponent>;
Мой Dynamic.component.ts
:
@Component({
selector: 'app-dynamic',
templateUrl: './Dynamic.component.html',
styleUrls: ['./Dynamic.component.scss']
})
export class DynamicComponent implements OnInit, AfterViewChecked {
constructor(public componentFactoryResolver: ComponentFactoryResolver, public viewContainerRef: ViewContainerRef, public changeDetectorRef: ChangeDetectorRef, public ref: ElementRef) {
}
...
}
Каждый раз , когда я пытаюсь получить доступ children
, QueryList
это не дает никаких результатов.
Другие вещи, которые я пробовал:
- Использование свойства метаданных «чтение»:
*.ts
:@ViewChildren('dynamic', { read: DynamicComponent }) children: QueryList<DynamicComponent>;
*.html
:<app-dynamic #dynamic></app-dynamic>
- Подписка на
QueryList
изменения черезAfterViewInit()
:public ngAfterViewInit(): void { this.children.changes.subscribe((c: QueryList<DynamicComponent>) => { ... }); }
- Использование
ContentChildren
(как с параметром ‘read’, так и без него):*.ts
:@ContentChildren('dynamic', { read: DynamicComponent }) children: QueryList<DynamicComponent>;
*.html
:<app-dynamic #dynamic></app-dynamic>
- Доступ к компоненту с помощью директивы:
@ViewChildren('dynamic', { read: DynamicDirective }) children: QueryList<DynamicDirective>;
- Доступ после принудительного обнаружения изменений:
this.viewContainerRef.detectChanges(); console.log(this.children.toArray());
Что я здесь делаю не так?
Комментарии:
1. В вашем
Tree.component.ts
случае, когда вы пытаетесь получить доступ к детям? Вы не сможете получить к ним доступ,ngOnInit()
это произойдетundefined
в этот момент.2. Я пытаюсь получить доступ к дочерним элементам в функции generateTreeContent, вызываемой в (щелчке), определенной в html. И я также попытался изменить подписку на дочернее свойство, которое должно обновляться с каждым изменением.
3. Я предполагаю, что
<app-dynamic>
это в инспекторе, это правильно?4. Да, я вижу бирку в «Инспекторе».
5. Когда вы подписываетесь на изменения, вы когда-нибудь получаете подписку для выполнения? Даже если вы расширите дерево?