В моем приложении angular2 я хотел бы иметь повторно используемый компонент выбора, который в первом черновике выглядит так:
import {Component, Input, Output, EventEmitter} from "@angular/core";
@Component({
selector: 'my-select',
template: `
<select [(ngModel)]="selectedValue" (ngModelChange)="selectionChanged()">
<option disabled="disabled" selected="selected" name="choose" value="choose">choose ...</option>
<option *ngFor="let opt of selectModel" [ngValue]="opt">
{{opt}}
</option>
</select>
`
})
export class SelectComponent {
@Output()
changed: EventEmitter<any> = new EventEmitter();
@Input()
selectModel: any[] = [];
selectedValue: any = 'choose';
selectionChanged() {
this.changed.emit(this.selectedValue);
}
}
К сожалению, это работает только с массивом строк в качестве входного параметра, так как
{{ opt }}
будет распечатывать только [Object object]
для других типов. И, таким образом, EventEmitter будет генерировать только строки.
Теперь я хотел бы иметь компонент, который я мог бы использовать примерно так:
import {Component} from "@angular/core";
export class Foo {
bar: string;
id: number;
userFriendlyString: string = `id=${this.id}|bar=${this.bar}`;
constructor(bar: string, id: number) {
this.bar = bar;
this.id = id;
}
}
@Component({
template: `<my-select [selectModel]="model" (changed)="handle($event)"></my-select>`
})
export class AppComponent {
model: Foo[] = [new Foo('first', 1), new Foo('second', 2)];
handle(foo: Foo): void {/* ... */}
}
Мои намерения:
- сообщить компоненту
my-select
, что отображаемые значения должны быть свойствомuserFriendlyString
компонентаFoo
. Я не хочу жестко кодировать это, поскольку другие компоненты также должны иметь возможность использоватьmy-select
с другими классами моделей. Я не представляю, как это сделать. Мой первый подход состоял в том, чтобы иметь функцию обратного вызова как@Input()
для компонентаmy-select
, но это не работает и не должно выполняться в соответствии с этот ответ. Второй подход состоял в том, чтобы переопределить toString вFoo
. Тоже не работает (я предполагаю что-то вроде отсутствия динамической отправки вany
...?!). - получить работу
EventEmitter
как «ожидаемую»: должна быть возможность иметь правильныйfoo: Foo
в функции дескриптора.
Так есть ли надежда для меня? :)