好了,到目前为止我是能够成功地结合<paper-radio>
,<paper- checkbox>
与ngModel通过使用自定义ControlValueAccessor
他们的每一个。现在我处于<paper-dropdown- menu>
这种情况,我可以捕获纸张下拉菜单(iron-select),但不能绑定双向,即使用下面的ngModel是HTML和自定义访问器类
我的form.html
<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));
}
}
完整的工作示例。我没有找到应用合适的方式ControlValueAccessor
来<paper-dropdown- menu>
,而是将其添加到embeeded <paper- listbox>
。唯一的缺点是,ControlValueAccessor
如果您对使用了不同的内容<paper-dropdown- menu>
,则可能需要使用其他内容。优点是,即使未包装在中,也可以使用ControlValueAccessor
with<paper- listbox>``<paper-dropdown-menu>
import {
Component,
Directive,
Renderer,
forwardRef,
Provider,
ElementRef,
ViewEncapsulation,
} from '@angular/core';
import {NG_VALUE_ACCESSOR, ControlValueAccessor} from '@angular/common';
const PAPER_MENU_VALUE_ACCESSOR = new Provider(
NG_VALUE_ACCESSOR, {useExisting: forwardRef(() => PaperMenuControlValueAccessor), multi: true});
@Directive({
selector: 'paper-listbox',
host: {'(iron-activate)': 'onChange($event.detail.selected)'},
providers: [PAPER_MENU_VALUE_ACCESSOR]
})
export class PaperMenuControlValueAccessor implements ControlValueAccessor {
onChange = (_:any) => {
};
onTouched = () => {
};
constructor(private _renderer:Renderer, private _elementRef:ElementRef) {
console.log('PaperMenuControlValueAccessor');
}
writeValue(value:any):void {
//console.log('writeValue', value);
this._renderer.setElementProperty(this._elementRef.nativeElement, 'selected', value);
}
registerOnChange(fn:(_:any) => {}):void {
this.onChange = fn;
}
registerOnTouched(fn:() => {}):void {
this.onTouched = fn;
}
}
@Component({
selector: 'my-app',
directives: [PaperMenuControlValueAccessor],
encapsulation: ViewEncapsulation.None,
template: `
<h2>Hello {{name}}</h2>
<paper-menu>
<paper-item>Item 1</paper-item>
<paper-item>Item 2</paper-item>
</paper-menu>
<paper-dropdown-menu label="Dinosaurs" >
<paper-listbox class="dropdown-content" [(ngModel)]="selected">
<paper-item *ngFor="let item of items">{{item}}</paper-item>
</paper-listbox>
</paper-dropdown-menu>
<div>selected: {{items[selected]}}</div>
`,
})
export class AppComponent {
items = ['allosaurus', 'brontosaurus', 'carcharodontosaurus', 'diplodocus'];
selected = 3;
name:string;
constructor() {
this.name = 'Angular2 (Release Candidate!)'
}
ngAfterViewInit() {
//this.selected = this.diplodocus;
}
}
柱塞示例
更新资料
我找到了类似的答案,PaperDropdownMenu
而不是将PaperListbox
Angle2模型绑定到聚合物下拉列表
我想根据ViewBag值过滤下面加载的ProductData dropdownlist,比如ViewBag。类别需要传递给GetProductData()的viewbag值。我怎样才能做到这一点。非常感谢。 控制器: //需要基于viewbag进行过滤。类别值
问题内容: 我想在Polymer和Angular之间进行两种方式的数据绑定,为此,我正在使用Angu- poly 库。 这是一个有效示例的链接,同时通过name和age属性传递字符串:working。 但是,当我尝试通过kid属性传递对象时,似乎出现了问题,这是链接:不起作用。 我应该怎么做才能使其正常工作? 更新: 也尝试过使用此库,但无法正常工作。该代码将如下所示: 重大更新: 在这里,我对“
本文向大家介绍Django choices下拉列表绑定实例,包括了Django choices下拉列表绑定实例的使用技巧和注意事项,需要的朋友参考一下 Models内容 Views内容 Test页面内容 显示结果为 补充知识:django前端页面下拉选择框默认值设置 1,前端样式 2,前端html代码 以上这篇Django choices下拉列表绑定实例就是小编分享给大家的全部内容了,希望能给大家
我试图用聚合物表达式来显示某些东西。 我有一个文件,它打印出json_encoded数组,例如名称。在我看来,有三种可能性: null
如何将本地数组绑定到剑道的MVVM dropdown列表。 我有一个这样的阵列 我想把它绑定到我的输入控件 它不工作。有什么想法我可以实现这一点吗? 谢谢
我在视图中定义了一个剑道下拉列表,如下所示: 我的模型有一个