2016-05-07 4 views
13

Я хочу использовать управляемые шаблоном формы в Angular 2, и мне нужно получить доступ к текущему ngForm в моей директиве, как локальное свойство, и я не хочу передавать их в качестве параметра.Angular 2 Template Driven Form access ngForm в компоненте

моя форма выглядит следующим образом:

<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); 
    } 
} 

Возможно ли это, потому что мне нужно проверить, если myFrm ист Валиде или была затронута в функции, где я не может передать текущую форму в качестве параметра, например «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> 

и в компоненте вы можете получить доступ к «КАДР» переменную с

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), я вижу пары ключевых значений в консоли браузера, но когда я пытаюсь перебрать этот.frm.controls в цикле for-in или попытаться получить ключи как массив с 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

Хотя этот код может ответить на вопрос, предоставляя дополнительный контекст относительно того, почему и/или как этот код отвечает на вопрос, улучшает его долгосрочную ценность. –

Смежные вопросы