带有ngModel和ngControl的Angular 2指令

时间:2016-03-08 21:52:18

标签: typescript angular angular2-template angular2-directives angular2-forms

我想编写一个Angular 2指令,该指令应具有以下行为:

  1. 无论有没有包裹<form [ngFormModel]="form">

  2. ,都必须可以使用
  3. 应使用[(ngModel)]进行数据绑定

  4. 在内部使用Observer,在最后一次用户输入发生后更新ngModel 250毫秒

  5. 当使用包装<form [ngFormModel]="form">时,应该可以听取form.valueChanges(当然应该在最后一次用户输入后250ms开火)

  6. 我已经编写了以下指令进行测试:

    import {Directive, EventEmitter, Input, Output} from 'angular2/core'
    import {NgModel} from 'angular2/common'
    import {Observable} from 'rxjs/Observable'
    
    @Directive({
        selector: '[queryDirective]'
    })
    export class QueryDirective {
        constructor(public model:NgModel) {}
    
        ngOnInit() {
            this.model.control.valueChanges
                .debounceTime(250)
                .subscribe(val => this.model.control.updateValue(val,{emitEvent:true}));
        }
    }
    

    使用 ngControl时有效。然后它说不能找到NgModel的提供者。

    <form [ngFormModel]="form">
        <input queryDirective ngControl="..." type="text" [(ngModel)]="...">
    </form>
    

    但是当我在构造函数上使用NgControl时,this.model.control.updateValue方法无法更新ngModel

    我做错了什么?或者有没有人有一些有效的示例代码?

    提前致谢!

1 个答案:

答案 0 :(得分:2)

我现在开始工作了!

这是我的指示:

import {Directive, Renderer, ElementRef, forwardRef, Provider} from 'angular2/core'
import {NG_VALUE_ACCESSOR, DefaultValueAccessor} from 'angular2/common'
import {CONST_EXPR} from 'angular2/src/facade/lang'
import {Observable} from 'rxjs/Observable'

const PROVIDER = CONST_EXPR(new Provider(NG_VALUE_ACCESSOR, {useExisting: forwardRef(() => QueryDirective), multi: true}));

@Directive({
    selector: '[queryDirective]',
    bindings: [PROVIDER]
})
export class QueryDirective extends DefaultValueAccessor {
    constructor(_renderer: Renderer, private el: ElementRef) {
        super(_renderer, el);
    }

    ngOnInit() {
        Observable.fromEvent(this.el.nativeElement, 'keyup')
            .map(val => this.el.nativeElement.value)
            .debounceTime(this.timeout)
            o.subscribe(this.onChange);
    }
}

我不清楚bindingsNG_VALUE_ACCESSOR内容的作用,但它有效!