Я создал stackblitz на вашем примере, который позволяет изменить имя HelloComponent, щелкнув другой HelloComponent
Объяснение
InЧтобы получить доступ к различным экземплярам компонента (HelloComponent), я использовал сервис (HelloService), который «знает» о существовании каждого экземпляра HelloComponent.
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 к объекту
helloComponents
(идентификатор в качестве ключа, экземпляр HelloComponent в качестве значения) и - функцию, котораяпозволяет изменить имя экземпляра HelloComponent с помощью идентификатора 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 теперь мы используем 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, и changeHelloComponentId
, который является идентификатором экземпляра HelloComponent-экземпляра, имя которого следует изменить, если щелкнуть текущий элемент.
Наконец, вам нужно изменить свой data
-лист:
this.data = [
{ id: 0, "name": "rio", changeId: 1 },
{ id: 1, "name": "angu" }]