Angular 2 指令与 ngModel 和 ngControl
Angular 2 Directive with ngModel and ngControl
我想编写一个 Angular 2 指令,它应该具有以下行为:
必须在有和没有包装的情况下都可用<form [ngFormModel]="form">
应该使用[(ngModel)]
进行数据绑定
在内部使用 Observer
,它会在最后一次用户输入发生后 ngModel
250 毫秒更新
当使用包装 <form [ngFormModel]="form">
时,应该可以监听 form.valueChanges
(当然应该在最后一次用户输入后 250 毫秒触发)
我编写了以下指令进行测试:
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}));
}
}
在使用 no ngControl
时有效。然后它说找不到 NgModel
的提供者。
<form [ngFormModel]="form">
<input queryDirective ngControl="..." type="text" [(ngModel)]="...">
</form>
但是当我在构造函数上使用 NgControl
时,this.model.control.updateValue
方法不会更新 ngModel
。
我做错了什么?或者有人有一些可用的示例代码吗?
提前致谢!
我现在开始工作了!
这是我的指令:
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);
}
}
我不知道 bindings
和 NG_VALUE_ACCESSOR
的作用,但它确实有效!
我想编写一个 Angular 2 指令,它应该具有以下行为:
必须在有和没有包装的情况下都可用
<form [ngFormModel]="form">
应该使用
[(ngModel)]
进行数据绑定在内部使用
Observer
,它会在最后一次用户输入发生后ngModel
250 毫秒更新当使用包装
<form [ngFormModel]="form">
时,应该可以监听form.valueChanges
(当然应该在最后一次用户输入后 250 毫秒触发)
我编写了以下指令进行测试:
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}));
}
}
在使用 no ngControl
时有效。然后它说找不到 NgModel
的提供者。
<form [ngFormModel]="form">
<input queryDirective ngControl="..." type="text" [(ngModel)]="...">
</form>
但是当我在构造函数上使用 NgControl
时,this.model.control.updateValue
方法不会更新 ngModel
。
我做错了什么?或者有人有一些可用的示例代码吗?
提前致谢!
我现在开始工作了!
这是我的指令:
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);
}
}
我不知道 bindings
和 NG_VALUE_ACCESSOR
的作用,但它确实有效!