Я пытаюсь найти способ динамически изменять некоторые html-строки компонента.
<li *ngFor="p in persons" [attr.id]="p.id">
<span> {{ p.name }} </span>
<a (click)="getAge(p.id)">Get Age<a/>
</li>
Если пользователь нажимает ссылку " Get Age
я бы хотел заменить содержимое внутри соответствующего тега li
на что-то вроде:
<span> {{ p.OtherProperty }} </span>
<a (click)="OtherMethod(p)">Call OtherMethod<a/>
Я обнаружил, что ComponentFactoryResolver
для создания динамических компонентов, но я нашел его слишком подавляющим только для двух строк html. И я попытался изменить его вручную, используя jquery, но он не работает для создания привязок событий:
getAge(id) {
//some work
//remove the corresponding <li> content
$('#' + id).append('<a (click)="getAnotherValue(p.name)">GetAnotherValue<a/>');
$('#' + id).append('<span> {{ p.age}} </span>'); //this obviously doesnt work. But thats the ideia.
}
Итак, как я могу заменить некоторые html-теги угловыми атрибутами динамически?
Вы можете динамически обращаться к Object
:
object[property]; // Where property is a string
// If property equals 'name', the above sentence would equal this:
object.name; // or 'object['name'];'
Итак, следуя вашему примеру, вы можете сделать это:
export class App {
persons = [
{
id: 1,
name: 'John',
age: 25
},
{
id: 2,
name: 'Mike',
age: 30
}
];
selectedProperty = 'name';
constructor() {
}
getProperty(prop) {
this.selectedProperty = prop;
}
}
И в вашем шаблоне вы могли:
<div>
<li *ngFor="let p of persons" [attr.id]="p.id">
<span> {{ p[selectedProperty] }} </span>
<br>
</li>
<button (click)="getProperty('age')">Get Age</button>
<button (click)="getProperty('name')">Get Name</button>
</div>
Если бы я хорошо понял, это должно было сделать трюк. Вы не можете использовать ngIf
потому что, если у вас есть 60 свойств или лиц, то будет несколько caothic.
<select>
где каждый <option>
является свойством объекта person
, например: Age, Name, Surname и т. Д. И, onChange()
для select, вы запускаете getProperty()
передавая как параметр значение <option>
.
Используйте ngIf
для активации кода, как показано:
<li *ngFor="p in persons" [attr.id]="p.id">
<div *ngIf=!p?.touched>
<span> {{ p.name }} </span>
<a (click)="getAge(p)">Get Age<a/>
</div>
<div *ngIf=p?.touched>
<span> {{ p.age}} </span>
<a (click)="getAnotherValue(p.name)">GetAnotherValue<a/>
</div>
</li>
isGetAgeClicked=false;
getAge(person) {
//some work
//remove the corresponding <li> content
person.touched=true
}