【问题标题】:Angular Attribute Directive form inputAngular 属性指令表单输入
【发布时间】:2016-08-14 13:46:46
【问题描述】:

我正在努力让 @Directive 按预期工作。

我希望 Attr 指令能够访问指令构造函数中的 model.password 并使用当前密码设置变量 varpassword。

我还希望能够检索表单字段中的所有其他输入,我该怎么做?

我知道,自从处于 Beta 版以来,其中很多文档都不完整。

这几天我一直在尝试解决这个问题,但收效甚微。我已经删除了我试图让它工作的导入,因为我想我很困惑如何在我尝试过的指令中正确使用它们“NgModel,NgControl,ControlGroup,NgFormModel,FormBuilder ...”。

下面是我的测试示例代码。

登录表单.html

<form #testForm="ngForm">
    Email Address: 
    <input type="text" name="username" size="50" required="required" [(ngModel)]="model.username" ngControl="username" #username="ngForm" />

    Password: 
    <input type="password" name="password" size="20" required="required" [(ngModel)]="model.password" ngControl="password" #password="ngForm" testdir />

    <input type="submit" value="Login" />
</form>

app.ts

import {Component} from 'angular2/core';

import {TestDirective} from '../../directives/test.directive';

@Component({
    selector: 'test-app',
    templateUrl: 'login-form.html',
    directives: [TestDirective]
})
export class TestApp {}

test.directive.ts

import {Directive} from 'angular2/core';

@Directive({
    selector: '[testdir]',
    host: {
        '(keydown)': 'run()'
    }
})
export class TestDirective {

    varpassword: string;

    constructor() {
        this.varpassword = [******]
    }

    run() {
        console.log( this.varpassword );
    }

}

如果有人能指出我正确的方向,将不胜感激。

【问题讨论】:

    标签: angular angular2-forms angular2-directives


    【解决方案1】:

    你需要在你的指令中注入NgControl:

    @Directive({
      (...)
    })
    export class TestDirective {
      varpassword: string;
    
      constructor(private ctrl:NgControl) {
      }
    
      ngOnInit() {
        this.varpassword = this.ctrl.value;
      }
    }
    

    请看这个 plunkr:https://plnkr.co/edit/3y4Qf7M4hb3zDIEJ773Q?p=preview。

    【讨论】:

    • 谢谢你,这太完美了。我试图在我的测试中设置构造函数中的变量,难怪它为什么不起作用。我现在已经研究了如何访问 ngForm,所以在使用控制台时(this.form.controls);我可以看到它返回的对象,你知道检查输入类型的方法,例如密码、输入等吗?再次感谢。
    • 您需要利用组件的生命周期挂钩。在构造函数中为时过早...要访问输入类型,您需要注入ElementRef。您可以通过nativeElement.type 获得此提示。我更新了 plunkr ;-)
    • 好的,我知道这是用于 attr 指令输入,但是表单对象中的所有其他输入呢?我想要实现的是观察表单中的所有输入以更改 ngModel,表单可以包含任意数量的输入,而不仅仅是用户名和密码。例如姓名、地址 1、地址 2、邮政编码、电子邮件、用户名、密码、验证密码。我将遍历 ngForm.controls 对象,并且任何不是密码类型的输入我都会推送到指令中的新数组中,并在自定义密码验证器中使用它们的值。感谢您的帮助:)
    • 要收到输入更改的通知,您可以利用控件的valueChanges 属性。这是一个可观察的,因此您可以订阅它们以获得通知。请参阅“与表单元素链接”部分中的这篇文章:restlet.com/blog/2016/04/12/…。
    【解决方案2】:

    聚焦时带逗号的输入指令示例。

    import {Directive, ElementRef} from '@angular/core';
        @Directive({
          selector: '[numberInput]',
          host: {
            '(focus)': '_onFocus()',
            '(blur)': '_onBlur()',
            '(keydown)': '_onKeypress($event)'
          }
        })
        export class InputNumberDirective {
          inputElement: ElementRef;
    
          constructor(el: ElementRef) {
            this.inputElement = el;
          }
    
          _onBlur() {
             this.inputElement.nativeElement.value = this.inputElement.nativeElement.value.length > 0 ? parseInt(this.inputElement.nativeElement.value).toString().replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,") : '';
          }
    
          _onKeypress(event: KeyboardEvent) {
              if((event.which>= 58 && event.which<=126) || (event.keyCode >= 33  && event.which<= 47)){
                event.preventDefault();
           }
              return event;
          }
        }
    

    【讨论】:

    猜你喜欢
    • 2023-03-27
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多