Bind angular 2 model to polymer dropdown

后端 未结 1 347
我寻月下人不归
我寻月下人不归 2020-12-10 19:09

I decided to take some time this weekend to look at Angular 2 and Polymer. I\'m really interested in angular 2 and would really like to start building something with it. One

相关标签:
1条回答
  • 2020-12-10 19:51

    I finally solved this by my own by implementing a custom Value Accessor, mainly by looking at how the default value accesssor is implmented. https://github.com/angular/angular/blob/2.0.0-alpha.46/modules/angular2/src/common/forms/directives/default_value_accessor.ts

    I struggled a bit with this since paper-menu wants the pre-selected value to be set as an attribute in the rendered html. In my first attempt I used angulars internal setProperty to set the selected value. However, this sets the DOM property and not the HTML attribute and resulted in that polymer didn't create a get,set property of selected which prevented the menu to trigger iron-select event which the dropdown menu listens for. Lesson learned, remember the difference between HTML and DOM.

    import {Directive, ControlValueAccessor, ElementRef, Renderer, NG_VALUE_ACCESSOR, Provider, forwardRef} from "angular2/angular2"
    import {CONST_EXPR} from 'angular2/src/facade/lang';
    
    const PAPER_MENU_VALUE_ACCESSOR = CONST_EXPR(new Provider(
        NG_VALUE_ACCESSOR, {useExisting: forwardRef(() => PaperMenuAccessor), multi: true}));
    
    @Directive({
      selector: 'paper-menu[ng-model]',
      bindings: [PAPER_MENU_VALUE_ACCESSOR]
    })
    export class PaperMenuAccessor implements ControlValueAccessor {
    
      onChange = (_) => {};
      onTouched = () => {};
    
      constructor(private _renderer: Renderer, private _elementRef: ElementRef) {
        this._elementRef.nativeElement.addEventListener('iron-select', (e) => {
          this.onChange(e.target.selected);
        });
      }
    
      writeValue(value: any): void {
        if(this._elementRef.nativeElement.select) {
          this._elementRef.nativeElement.select(value);
        }
        else {
          this._elementRef.nativeElement.setAttribute("selected", value);
        }   
      }
    
      registerOnChange(fn: () => any): void { this.onChange = fn; }
      registerOnTouched(fn: () => any): void { this.onTouched = fn; }
    }
    
    0 讨论(0)
提交回复
热议问题