没有 ngmodel 指令 angular 的两种数据绑定

Dav*_*sio 6 html angular angular7

我在控制台中看到 ngmodel 已被弃用,并将在 angular 7 上删除。我有一个指令使用它来进行双向数据绑定,我如何才能做到这一点[(ngmodel)]

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

@Directive({
  selector: '[onlyFloat]'
})
export class OnlyFloatDirective {

    private regex: RegExp = new RegExp(/^-?[0-9]+(\.[0-9]*){0,1}$/g);

    private specialKeys: Array<string> = [ 'Backspace', 'Tab', 'End', 'Home', '-' ];

    constructor(private el: ElementRef) {
    }
    @HostListener('keydown', [ '$event' ])
    onKeyDown(event: KeyboardEvent) {
        if (this.specialKeys.indexOf(event.key) !== -1) {
            return;
        }
        let current: string = this.el.nativeElement.value;
        let next: string = current.concat(event.key);
        if (next && !String(next).match(this.regex)) {
            event.preventDefault();
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

HTML:

<div class="ui-g-12 ui-md-6">
   <label >Valor da Venda</label><br>
   <input type="text" pInputText onlyFloat [(ngModel)]="produtoAgilForm.controls['ValorVenda'].value" placeholder="Valor Venda" formControlName="ValorVenda">
</div>
Run Code Online (Sandbox Code Playgroud)

Deb*_*ahK 4

为了清楚起见,请注意 ngModel在与响应式表单一起使用时才被弃用。这已经是一段时间的建议了……但现在它在 v6 中已弃用,并将在 v7 中删除。

有关更多信息,请参阅文档的这一部分:https://angular.io/api/forms/FormControlName

如果删除 ngModel 时删除了部分文档:

Angular v6 中已弃用对使用 ngModel 输入属性和 ngModelChange 事件与反应式表单指令的支持,并将在 Angular v7 中删除。

现已弃用:

<form [formGroup]="form">   <input
      formControlName="first" [(ngModel)]="value"> </form>
Run Code Online (Sandbox Code Playgroud)

this.value = 'some value';

由于某些原因,此功能已被弃用。首先,开发人员发现这种模式令人困惑。看起来好像正在使用实际的 ngModel 指令,但实际上它是反应式表单指令上名为 ngModel 的输入/输出属性,它只是近似其(某些)行为。具体来说,它允许获取/设置值并拦截值事件。然而,ngModel 的一些其他功能(例如使用 ngModelOptions 延迟更新或导出指令)根本不起作用,这可以理解地导致了一些混乱。

以下是根据上述参考文档建议的更改:

要在 v7 之前更新代码,您需要决定是坚持使用反应式表单指令(并使用反应式表单模式获取/设置值)还是切换到模板驱动指令。

之后(选择 1 - 使用反应形式):

<form [formGroup]="form">
  <input formControlName="first">
</form>


this.form.get('first').setValue('some value');
Run Code Online (Sandbox Code Playgroud)

为了回答你的问题......你不应该在这里需要 ngModel 。您的绑定应该通过使用formControlName. 要设置该值,请使用上面显示的代码。

你的指令不起作用吗?如果没有,你能提供一个 stackblitz 来演示吗?