![](/img/trans.png)
[英]ngModelChange in Angular not working when input box changes from somewhere else using two way data binding
[英]Angular - two way data binding from @Input not working
我正在尝试通过将其余部分重置为0(使用输入组件的以下代码)来实现仅接受数字值的自定义输入:
import {Component, Input, Output, ElementRef, EventEmitter} from '@angular/core';
import {Observable} from 'rxjs/Rx';
@Component({
selector: 'debounce-input',
template: '<input type="text" [placeholder]="placeholder" [(ngModel)]="_v">'
})
export class DebounceInputComponent {
@Input() placeholder: string
@Input() delay: number = 300
_v: string
@Input()
get v(): string {
return this._v
}
set v(_value) {
this._v = _value
this.valueChange.emit(this.v)
}
@Output() valueChange: EventEmitter<any> = new EventEmitter<any>()
@Output() value: EventEmitter<any> = new EventEmitter<any>()
constructor(private elementRef: ElementRef) {
const eventStream = Observable.fromEvent(elementRef.nativeElement, 'keyup')
.map(() => this.v)
.debounceTime(this.delay)
.distinctUntilChanged()
eventStream.subscribe((obj) => this.value.emit({v: this.v}))
}
}
上面的组件使用以下代码导入到AppComponent中:
HTML部分:
<div style="text-align:center"> <debounce-input [v]="mynumber" delay="1000" placeholder="Type something..." (value)="handle($event)"> </debounce-input> </div>
TypeScript部分:
import { Component } from '@angular/core'; @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css'] }) export class AppComponent { title = 'app'; mynumber = 0 handle(obj) { console.log(obj.v) if (isNaN(Number(obj.v))) { console.log('trying to reset invalid input to 0') this.mynumber = 0 } }}
问题是,无论何时我键入非数字值, AppComponent
无法将输入重置为0,尽管在控制台中显示了“试图将无效输入重置为0”消息。
这种现象的原因是什么?
我想到了。 您的@Input值未更改,因为父级中的mynumber
与子级中的mynumber
。 我添加了此功能,它的工作原理是:
handle(obj) {
console.log(obj.v)
if (isNaN(Number(obj.v))) {
console.log('trying to reset invalid input to 0')
this.mynumber = 0;
} else {
this.mynumber = obj.v; // add this line
}
}
附注:不过,我仍然考虑将您的输入限制为仅数字类型,并添加一些过滤器以防止设置数字,例如“ 0123”。
修改输入组件中的设置器,并使ngModel指向v而不是_v。
import {Component, Input, Output, ElementRef, EventEmitter} from '@angular/core';
import {Observable} from 'rxjs/Rx';
@Component({
selector: 'debounce-input',
template: '<input type="text" [placeholder]="placeholder" [(ngModel)]="v">'
})
export class DebounceInputComponent {
@Input() placeholder: string
@Input() delay: number = 300
_v: string
@Input()
get v(): string {
return this._v
}
set v(_value) {
if (isNaN(Number(_value))) {
console.log('trying to reset invalid input to 0')
this._v = '0';
return;
}
this._v = _value
this.valueChange.emit(this.v)
}
@Output() valueChange: EventEmitter<any> = new EventEmitter<any>()
@Output() value: EventEmitter<any> = new EventEmitter<any>()
constructor(private elementRef: ElementRef) {
const eventStream = Observable.fromEvent(elementRef.nativeElement, 'keyup')
.map(() => this.v)
.debounceTime(this.delay)
.distinctUntilChanged()
eventStream.subscribe((obj) => this.value.emit({v: this.v}))
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.