gpt4 book ai didi

angular - 如何从指令更新 ngModel?

转载 作者:太空狗 更新时间:2023-10-29 18:15:13 27 4
gpt4 key购买 nike

我创建了一个指令来限制 input 字段 type=number 的长度。

//输入

<input min="1" appLimitTo [limit]="5" type="number" name="property" [(ngModel)]="property">

//指令

import {Directive, HostListener, Input} from '@angular/core';

@Directive({
selector: '[appLimitTo]',
})
export class LimitToDirective {

@Input() limit: number;
@Input() ngModel: any;

@HostListener('input', ['$event'])
onInput(e) {
if (e.target.value.length >= +this.limit) {
e.target.value = (e.target.value).toString().slice(0, this.limit - 1);
e.preventDefault();
}
}
}

如果我们通过键盘输入值,它就可以正常工作。但是,如果我复制并粘贴 12345678913465789 这个数字,这一行 e.target.value = (e.target.value).toString().slice(0, this. limit - 1); 将其缩短到极限,但 ngModel 仍包含 12345678913465789 值。如何更新这个 ngModel 值?

请帮忙。

PS - 我应该在指令中添加什么以满足要求?

最佳答案

您可以将 NgControl 注入(inject)到您自己的指令中。然后您可以监听控件的 valueChanges 事件。

limit-to.directive.ts

import {Directive, HostListener, Input, OnInit, OnDestroy} from '@angular/core';
import {NgControl} from '@angular/forms';
import {map} from 'rxjs/operators';
import {Subscription} from 'rxjs/Subscription';

@Directive({
selector: '[appLimitTo]',
})
export class LimitToDirective implements OnInit, OnDestroy {
@Input('appLimitTo') limit: number;

private subscription: Subscription;

constructor(private ngControl: NgControl) {}

ngOnInit() {
const ctrl = this.ngControl.control;

this.subscription = ctrl.valueChanges
.pipe(map(v => (v || '').toString().slice(0, this.limit)))
.subscribe(v => ctrl.setValue(v, { emitEvent: false }));
}

ngOnDestroy() {
this.subscription.unsubscribe();
}
}

用法:

<input ngModel appLimitTo="3" type="number" />

Live demo

关于angular - 如何从指令更新 ngModel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49733929/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com