Ответ 1
Я бы сказал, что это зависит от того, что вы хотите сделать.
Если раскрывающееся меню является компонентом для формы, управляющей состоянием, я бы использовал двустороннюю привязку Angular2. Для этого я бы использовал два атрибута: входной, чтобы получить связанный объект, а выходной - для уведомления при изменении состояния.
Вот пример:
export class DropdownValue {
value:string;
label:string;
constructor(value:string,label:string) {
this.value = value;
this.label = label;
}
}
@Component({
selector: 'dropdown',
template: `
<ul>
<li *ngFor="let value of values" (click)="select(value.value)">{{value.label}}</li>
</ul>
`
})
export class DropdownComponent {
@Input()
values: DropdownValue[];
@Input()
value: string[];
@Output()
valueChange: EventEmitter;
constructor(private elementRef:ElementRef) {
this.valueChange = new EventEmitter();
}
select(value) {
this.valueChange.emit(value);
}
}
Это позволяет использовать его следующим образом:
<dropdown [values]="dropdownValues" [(value)]="value"></dropdown>
Вы можете создать раскрывающийся список внутри компонента, применить стили и управлять выборами внутри.
Edit
Вы можете заметить, что вы можете либо просто использовать пользовательское событие в своем компоненте, чтобы инициировать выбор выпадающего списка. Таким образом, компонент теперь будет примерно таким:
export class DropdownValue {
value:string;
label:string;
constructor(value:string,label:string) {
this.value = value;
this.label = label;
}
}
@Component({
selector: 'dropdown',
template: `
<ul>
<li *ngFor="let value of values" (click)="selectItem(value.value)">{{value.label}}</li>
</ul>
`
})
export class DropdownComponent {
@Input()
values: DropdownValue[];
@Output()
select: EventEmitter;
constructor() {
this.select = new EventEmitter();
}
selectItem(value) {
this.select.emit(value);
}
}
Затем вы можете использовать компонент следующим образом:
<dropdown [values]="dropdownValues" (select)="action($event.value)"></dropdown>
Обратите внимание, что метод action
является одним из родительского компонента (а не выпадающего).