我在您的示例上创建了一个stackblitz,它可以通过单击另一个 HelloComponent 来更改 HelloComponent 的名称
解释
为了访问组件的不同实例(HelloComponent),我使用了一个服务(HelloService),它“知道”每个 HelloComponent-Instance 的存在。
import { Injectable } from '@angular/core';
import { HelloComponent } from './hello.component';
@Injectable({
providedIn: 'root',
})
export class HelloService {
helloCompoents = {}
constructor() { }
add(_id: number, _component: HelloComponent) {
// store a reference to the component and use the components id as identifier
this.helloCompoents[_id] = _component;
}
change(_id) {
// here you can define the new name
this.helloCompoents[_id].name = 'some other name'
}
}
服务很简单。它所做的只是提供
- 向对象添加新的 HelloComponent-instance 的函数
helloComponents
(id 作为键,HelloComponent-instance 作为值)和
- 一个函数,它使您能够通过使用 HelloComponent 的 id 来标识应该更改的组件来更改 HelloComponent 实例的名称。
由于服务还不知道任何 HelloComponent 实例,我们需要更改 HelloComponent:
import { Component, Input, OnInit } from '@angular/core';
import { HelloService } from './hello.service';
@Component({
selector: 'hello',
template: `<h1 (click)="change()">Hello {{name}}!</h1>`,
styles: [`h1 { font-family: Lato; }`]
})
export class HelloComponent implements OnInit {
@Input() id: number;
@Input() name: string;
@Input() changeHelloComponentId: number;
constructor(private helloService: HelloService) { }
ngOnInit() {
// add the current HelloComponent to the list of helloComponents within the service
this.helloService.add(this.id, this);
}
change() {
// call the change function of the service which will then change the name of the defined HelloComponent
this.helloService.change(this.changeHelloComponentId);
}
}
在创建 HelloComponent-instance 时,我们现在使用 HelloService 将当前实例添加到服务的 helloComponents 中。
click 函数将调用 helloService.change(..) 函数,然后更改名称。
HelloComponent 的模板现在看起来像这样:
<div *ngFor="let list of data ">
<hello id="{{list.id}}" name="{{ list.name }}" changeHelloComponentId="{{list.changeId}}"></hello>
</div>
我添加了id
哪个是当前 HelloComponent-instancechangeHelloComponentId
的 id,哪个是 HelloComponent-instance 的 id,如果单击当前项目,应该更改其名称。
最后你需要改变你的data
-list:
this.data = [
{ id: 0, "name": "rio", changeId: 1 },
{ id: 1, "name": "angu" }]