首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重新渲染angular 7组件

重新渲染angular 7组件
EN

Stack Overflow用户
提问于 2019-02-28 18:49:15
回答 3查看 4.9K关注 0票数 0

我得到了这个组件的层次结构。拥有2个子组件的父组件。我希望第一个子组件更新父组件的属性,然后第二个子组件重新呈现。我得到了带有两个子组件的主组件:一个带有select html输入,第二个是数据表,数据来自主组件作为输入。其想法是,当我更改所选值时,我希望更改主组件中的数据,以便数据表可以从主组件中获得新数据。我该怎么做呢?

在第一个孩子中:

代码语言:javascript
复制
@Output() optionSelected = new EventEmitter<string>();

@Input()数据;

在父级中:

代码语言:javascript
复制
 @Input() displayOption: string;
 @Output() dataToSelect 

当displayOption更新时,我希望第二个子对象重新呈现

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-02-28 19:20:42

如果你使用的是ChangeDetectionStaretgy.OnPush,在你的子组件中传递可观察到的数据可能会很有用,并使用异步管道。这样,子组件将仅在observable发出时重新绘制:

第一个孩子:

代码语言:javascript
复制
@Output() optionSelected = new EventEmitter<string>();

selectOption() {
  this.optionSelected.emit('firstChild')
}

First Child html:

代码语言:javascript
复制
<button (click)="selectOption()">Select<button>

第二个孩子:

代码语言:javascript
复制
@Input() data$;

第二个Child.html:

代码语言:javascript
复制
<p>{{data$ | async}}</p>

父级:

代码语言:javascript
复制
data = new BehaviorSubject('')
setSelectedOption(val) {
  this.data.next(val)
}

Parent.html:

代码语言:javascript
复制
<first-child (optionSelected)="setSelectedOption($event)"></first-child>
<second-child [data$]=""></second-child>
票数 0
EN

Stack Overflow用户

发布于 2019-02-28 19:00:27

@Output装饰器用于在子组件与父组件之间共享数据。EventEmitter用于发送值。

child.component.ts

代码语言:javascript
复制
@Output() optionSelected = new EventEmitter<string>();

sendDataToChild() {
  this.optionSelected.emit('hello');
}

parent.component.html

在子组件的选择器中,您可以使用(optionSelected)侦听事件,当事件被发出时,父组件中的log()方法将被调用。

代码语言:javascript
复制
<child-comp (optionSelected)="log($event)"></child-comp>

parent.component.ts

代码语言:javascript
复制
log(value) {
   console.log(value);
}
票数 0
EN

Stack Overflow用户

发布于 2019-02-28 22:58:47

要动态重新呈现组件,可以使用ComponentFactoryResolver,如下所示:

在您的HTML模板中,您需要一个新组件的“锚”:

代码语言:javascript
复制
<ng-template #child2></ng-template>

在您的parent-component.ts中,您将需要通过ViewChild引用锚点,并且您将需要注入ComponentFactoryResolver:

代码语言:javascript
复制
constructor(private cfr: ComponentFactoryResolver) { }

@ViewChild('child2', { read: ViewContainerRef }) childHost: ViewContainerRef;

renderChild2(data ?: any) { // im making this optional because i dont know if you require any data to init the component
    this.childHost.clear(); // clear the current rendered component inside the anchor (if any)
    const factory = this.cfr.resolveComponentFactory(<YOUR COMPONENT NAME>);
    const componentReference = this.childHost.createComponent(factory);
    if (data) {
        componentReference.instance.data = data; // you can access any public property/method in your component via instance
    }
}

只要想要重新呈现child2组件,就需要调用renderChild2() fcn。

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

https://stackoverflow.com/questions/54923904

复制
相关文章

相似问题

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