2016-05-07 14 views
13

テンプレートドリブンフォームをAngular 2で使用したいのですが、ローカルのプロパティとして現在のngFormにアクセスする必要があり、パラメータとして渡す必要はありません。角2テンプレート駆動フォームアクセスngForm inコンポーネント

私のフォームは次のようになります。私はmyFrmイストのヴァリデをかどうかを確認する必要がありますまたはI機能に感動したので

<form #frm="ngForm" (ngSubmit)="save(frm)"> 
    <input [(ngModel)]="user.name" #name="ngForm" type="text"> 
    <a (click)="showFrm()" class="btn btn-default">Show Frm</a> 
</form> 

と私のコンポーネント

@Component({ 
    selector: 'addUser', 
    templateUrl: `Templates/AddUser`, 
}) 

export class AddUserComponent implements CanDeactivate { 
    public user: User; 
    // how can I use this without defining the hole form 
    // in my component I only want to use ngModel 
    public frm : ngForm | ControlGroup; 

    public showFrm() : void{ 
     //logs undefined on the console 
     console.log(this.frm); 
    } 
} 

では、可能なこのです現在のフォームをパラメータとして渡すことはできません。 "routerCanDeactivate"と私はモデル駆動型のフォームをあまりにも多くのコードを書くために使用したくないと私は古い学校ng1モデルのバインディングが大好きです。

私は私の例を更新しました、そして、frmはコンポーネントで知られていません。

+0

私はgithubの上の機能要求を作成しました:https://github.com/angular/angular/issues/8538 – squadwuschel

+0

は 'AddUserComponent'は、子要素としてフォーム内に配置されるべきか? ' <フォーム#FRM = "ngForm"(ngSubmit)= "セーブ(FRM)"> ... <追加 - ユーザーのコンポーネントを...> ' – Felix

答えて

29

確認したい入力にngControl属性が必要です。

<form #frm="ngForm" (ngSubmit)="save(frm)"> 
    <input [(ngModel)]="user.name" #name="ngForm" ngControl="name" type="text"> 
    <a (click)="showFrm()">Show Frm</a> 
</form> 

およびコンポーネントに、あなたは、コンストラクタでfrmにアクセスすることはできません

import {Component, ViewChild} from 'angular2/core'; 
... 
@ViewChild('frm') public userFrm: NgForm; 
... 
public showFrm(): void{ 
    console.log(this.frm); 
} 

で「FRM」変数にアクセスすることができ、それは現時点では存在しないのですが、のOnInitでますそれにアクセスすることができます。

+0

@squadwuschelコンポーネントのフォームコントロールにアクセスしようとしましたが、それぞれのコンポーネントでsetErrors()を呼び出しました。ですから、console.log(this.frm.controls)でログオンしたときに、ブラウザのコンソールでキー値のペアが表示されますが、this.frm.controlsをfor-loopで繰り返したり、キーを配列として取得しようとするとObject.keys(this.frm.controls)を使用すると、空の配列が返されます。あなたはそのような問題を経験しましたか?ヒントやアドバイスをいただければ幸いです。 –

+0

'#name =" ngForm "は' input'要素に対して有効ですか? – Felix

-2
<h1>Login</h1> 
    <hr> 
    <div class="col-md-4"> 
     <form autocomplete="off" #loginForm="ngForm" (ngSubmit)="login(loginForm.value)"> 
      <div class="form-group"> 
<em *ngIf="loginForm.controls.userName?.invalid>required</em> 
       <label for="userName">User Name:</label> 
       <input id="userName" (ngModel)="userName" name="userName" type="text" class="form-control" 
         placeholder="User Name..." /> 
      </div> 
      <div class="form-group"> 
<em *ngIf="loginForm.controls.password?.invalid">required</em> 
       <label for="password">Password:</label> 
       <input id="password" (ngModel)="password" name="password" type="password" class="form-control" placeholder="Password..." /> 
      </div> 

      <button type="submit" [disabled="loginForm.invalid"]class="btn btn-primary">Login</button> 
      <button type="button" class="btn btn-default">Cancel</button> 
     </form> 
    </div> 

    ////login component 
    import { Component } from '@angular/core' 

    import {AuthService} from './auth.service' 

    @Component({ 

     selector: 'login', 
     templateUrl: './app/login/login.component.html' 
    }) 

    export class LoginComponent { 

     constructor(private authService : AuthService){} 

     login(formValues) { 
      this.authService.loginUser(formValues.userName, formValues.password) 
     } 

    } 
+1

このコードは質問に答えるかもしれませんが、このコードが質問に答える理由と理由についての追加の文脈を提供することで、長期的な価値が向上します。 –