これまでのところ、<paper-radio>
,<paper-checkbox>
をngModelに、それぞれControlValueAccessor
を使用してバインドすることに成功しました。今、私はここで<paper-dropdown-menu>
シナリオにこだわって、私は紙のドロップダウンをキャプチャすることができます(鉄・セレクト)が、ngModelは、以下のHTMLとカスタムアクセサクラスngModelポリマーにバインドするドロップダウンリスト(Angular2)
で使用して、すなわち-twoウェイを結合することができない私
<paper-dropdown-menu [(ngModel)]="mymodel.selection" label="Your Fix">
<paper-menu class="dropdown-content">
<paper-item value="1" ngDefaultControl>Coffee</paper-item>
<paper-item value="2" ngDefaultControl>Cigarettes</paper-item>
<paper-item value="3" ngDefaultControl>Chivas</paper-item></paper-menu>
</paper-dropdown-menu>
そして、私のカスタムアクセサクラス
/**
* Created by pratik on 12/5/16.
*/
import {
Query,
Directive,
Renderer,
Self,
forwardRef,
Provider,
ElementRef,
QueryList
} from 'angular2/core';
import {ObservableWrapper} from 'angular2/src/facade/async';
import {NG_VALUE_ACCESSOR, ControlValueAccessor} from 'angular2/common';
import {CONST_EXPR} from 'angular2/src/facade/lang';
const SELECT_VALUE_ACCESSOR = CONST_EXPR(new Provider(
NG_VALUE_ACCESSOR, {useExisting: forwardRef(() => SelectControlValueAccessor), multi: true}));
/**
* Marks `<option>` as dynamic, so Angular can be notified when options change.
*
* ### Example
*
* ```
* <select ngControl="city">
* <option *ngFor="#c of cities" [value]="c"></option> Need to change to paper-item
* </select>
* ```
*/
@Directive({selector: 'option'}) // Tried changing to paper-item but still doesn't work
export class NgSelectOption {
}
/**
* The accessor for writing a value and listening to changes on a select element.
*/
@Directive({
selector: 'paper-dropdown-menu[ngControl],paper-dropdown-menu[ngFormControl],paper-dropdown-menu[ngModel]',
host: {
'(iron-select)': 'onChange($event.target.value)',
'(input)': 'onChange($event.target.value)',
'(blur)': 'onTouched()'
},
bindings: [SELECT_VALUE_ACCESSOR]
})
export class SelectControlValueAccessor implements ControlValueAccessor {
value: string;
onChange = (_) => {};
onTouched =() => {};
constructor(private _renderer: Renderer, private _elementRef: ElementRef,
@Query(NgSelectOption, {descendants: true}) query: QueryList<NgSelectOption>) {
this._updateValueWhenListOfOptionsChanges(query);
}
writeValue(value: any): void {
this.value = value;
this._renderer.setElementProperty(this._elementRef, 'value', value);
}
registerOnChange(fn:() => any): void { this.onChange = fn; }
registerOnTouched(fn:() => any): void { this.onTouched = fn; }
private _updateValueWhenListOfOptionsChanges(query: QueryList<NgSelectOption>) {
ObservableWrapper.subscribe(query.changes, (_) => this.writeValue(this.value));
}
}
イムの
PaperDropdownMenu
のための同様の答えを見つけましたそれに.. –!! ...ちょうど素晴らしい@zoechi!いつかの周りを試してみた。ありがとう!あなたのプランカの例がうまくいく、私はアプリケーションがルーティングを使用してbeacuse beacuseへのインポートを変更しました。私の主な焦点は、PolymerとAngular2を使用することが賢明であるかどうかをチェックすることです。とにかく再びありがとう! –
いくつか問題があります。テンプレート要素をPolymer要素に渡す必要がある場合や、スタイリングのために、独自のPolymer要素でpaper-xxx要素を折り返す必要がある場合があります。しかし全体的にはうまくいくはずです。 –