angular - Obținerea valorii HTML interne din lista derulantă
Folosesc un dropdown Bootstrap astfel:
<ul class="dropdown-menu">
<li>
<a class="dropdown-item" href="#" (click)="getMyValue('myvalue')">My Value</a>
</li>
<li>
<a class="dropdown-item" href="#" (click)="getMyValue('someothervalue')">Some Other Label</a>
</li>
</ul>
și funcția arată așa:
getMyValue(todo: string) {
console.log("selected value is:", todo);
console.log("selected text is:", ???);
}
În loc să analizez textul ca al doilea parametru, cum ar fi "Valoarea Mea 01", "02" etc., există vreo modalitate să omit acest lucru și să-l folosesc inteligent astfel încât să nu fie nevoie să scriu aceleași lucruri de mai multe ori?
Răspuns #1
Poți transmite evenimentul metodei tale.
<li>
<a class="dropdown-item" href="#" (click)="getMyValue('myval1', $event)"
>My Value 01</a>
</li>
<li>
<a class="dropdown-item" href="#" (click)="getMyValue('myval2', $event)"
>My Value 02</a>
</li>
Și preia eticheta cu event.target.value.
getMyValue(todo: string, event: any) {
console.log('selected value is:', todo);
console.log("selected text is:", event.target.text);
}
Alternativ, puteți lua în considerare lucrul cu un array pentru a genera elementele HTML.
Astfel, poți transmite fiecare element item metodei în timpul evenimentului de clic.
items = [
{ value: 'myval1', label: 'My Value 01' },
{ value: 'myval2', label: 'My Value 02' },
];
getMyValue(item: any) {
console.log('selected value is:', item.value);
console.log('selected text is:', item.label);
}
<li *ngFor="let item of items">
<a class="dropdown-item" href="#" (click)="getMyValue(item)"
>{{item.label}}</a>
</li>
Demo @ StackBlitz
Răspunsul #2
Poți folosi @for pentru a rula bucla și @if with as sintaxă, pentru a crea eticheta de afișare și a o reutiliza atât pentru funcție, cât și pentru etichetă!
Sintaxa Fluxului de Control Angular
import { Component } from '@angular/core';
import { bootstrapApplication } from '@angular/platform-browser';
import 'zone.js';
@Component({
selector: 'app-root',
standalone: true,
template: `
<ul class="dropdown-menu">
@for(i of arr;track $index) {
<li>
@if(i?.toString()?.padStart(2);as displayName) {
<a class="dropdown-item" href="#" (click)="getMyValue('myval' + i, displayName)">My Value {{displayName}}</a>
}
</li>
}
</ul>
`,
})
export class App {
name = 'Angular';
arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
getMyValue(todo: string, displayName: string) {
console.log('selected value is:', todo);
console.log('selected text is:', displayName);
}
}
bootstrapApplication(App);
Demonstrație Stackblitz
