6

对如何在 angular2 beta 中使用表单(模板或模态驱动)有点困惑。

目前我正在使用模态驱动的表单,但我的 form.html 出现了一些错误:

<form [ngFormModel]="demo">
        <input type="text"  [ngFormControl]="demo.controls['name']">
        <input type="text"  [ngFormControl]="demo.controls['batch']">
        <div> 
            <input type="radio" [ngFormControl]="demo.controls['radio']" name="status" value="true"> Active
            <input type="radio" [ngFormControl]="demo.controls['radio']" name="status" value="false">Inactive 
        </div>
        <div> 
            <input type="checkbox" [ngFormControl]="demo.controls['checkbox']" name="one" value="one"> one
            <input type="checkbox" [ngFormControl]="demo.controls['checkbox']" name="two" value="two">two 
        </div>
        <select [ngFormControl]="demo.controls['select']">
            <option value="one">Oone</option>
            <option value="two">two</option>
            <option value="three">three</option>
            <option value="four">four</option>
        </select>
        <button type="button" class="btn btn-primary btn-lg" data-dismiss="modal" (click)="demoSubmit(demo.value)">Done</button>
</form>

和 form.ts 文件在这里:

import {Component, View} from 'angular2/core';
import {FORM_DIRECTIVES, CORE_DIRECTIVES, FormBuilder, Control, ControlGroup} from 'angular2/common';
import {ROUTER_DIRECTIVES} from 'angular2/router';

@Component({
    selectro: 'Form',
    templateUrl: 'src/components/form/form.html',
    directives: [CORE_DIRECTIVES, FORM_DIRECTIVES],
})
export class FormDemo{
    demo:ControlGroup;
    constructor(fb:FormBuilder){
        console.log("Form Called");

        this.demo= fb.group({
            name: ["pardeep"],
            batch: [],
            checkbox: [],
            radio: [],
            select: []
        })
    }
    demoSubmit (){
        console.log(JSON.stringify(this.demo.value));
    }
}

所以,我的问题是:

  1. 哪种形式是最好的模板或模式驱动,为什么?
  2. 何时使用 ngControl 何时使用 ngModal ?

PS:-在这个例子中我无法获得单选按钮和复选框的值我做错了什么,在这个例子中我是模态驱动形式从这里开始

欢迎任何好的参考或示例。谢谢。

4

5 回答 5

7

I'm guessing that by ngModal you mean ngModel.

"1-which form is best template or modal driven and why ?"

from: http://blog.ng-book.com/the-ultimate-guide-to-forms-in-angular-2/

To create a new ControlGroup and Controls implicitly use:

ngForm and ngControl

To bind to an existing ControlGroup and Controls use:

ngFormModel and ngFormControl

Basically one is more convenient but gives you less control, personally I try to use template driven first because its more simple and less code, until it is not enough then I switch to model driven.

2- When to use ngControl and when to use ngModel ?

I don't know if you are mixing concepts here but ngControl and ngModel are not precisely meant to replace each other, ngModel handles the sync between input components and your domain/presentation model while ngControl handles the state of the form based on Validators, dirtiness of the input, etc, more geared towards giving feedback and allowing/stopping the user from submitting an unvalid form.

The ones that could replace each other are the one I mentioned previously in answer 1.

I hope that helps clarify a little bit?

As for the values of checkbox and radios, you only have ngFormControl's on them, add ngModel to map their values into your model. Once again quoting from the same page:

<input type="text" id="productNameInput" placeholder="Product Name" [ngFormControl]="myForm.find('productName')" [(ngModel)]="productName">

You can see that he is using both the ngFormControl and the ngModel.

于 2016-01-10T16:12:17.943 回答
6

在 angular2 中清除了与 FORM 相关的一些要点,因此发布为答案可能对某人有所帮助!

何时使用 ngControl 何时使用 ngModel ?

基本上我们可以 ngControl 来获取表单的值以及验证,但是有一些使用这种方法的问题,所以最好的解决方案是根据我ngModel的使用将表单的值获取到你的类中并ngControl用于验证目的。Angular 提供了默认验证器来检查验证,我们也可以根据需要创建自定义验证器,并可以在验证中使用(ngControl)。如果我们要创建模型驱动表单,即我们必须通过使用为每个输入创建新控件new Control()。对于控制、控制组和验证,请参阅此最佳文章

http://blog.ng-book.com/the-ultimate-guide-to-forms-in-angular-2/

这是使用表单控件的基本示例:

this.CreateGroup = fb.group({
            'name': new Control(this.demoInfo.name, Validators.required),
            'password': new Control(this.demoInfo.password, Validators.required),
            'select': new Control(this.demoInfo.select, Validators.required)
        })

这里我有三个输入,分别命名为 name、password、select。和相应的我已经提到了它们的值和验证器(默认验证)。

<input type="text" [(ngModel)]='demoInfo.name' ngControl='name'>

这是我们如何将 ngControl 定义为 HTML 端。

带有控件和验证的 Angular2 FORM。

经过大量搜索后,我得出结论,使用 ngModel 最好从表单中获取值。通过使用相同的形式,更容易清除表单的控件。并且验证变得容易。并用于ngControl检查验证。

这是我的表单工作代码。

<form class="form-horizontal" id='myForm' role="form" [ngFormModel]="CreateGroup">

  <div class="col-md-7">
    Name: <input type="text" [(ngModel)]='demoInfo.name' class="form-control" ngControl='name'>
  </div>
  
  <div class="col-md-7">
    Password:   <input type="password" [(ngModel)]='demoInfo.password' class="form-control" ngControl='password'>
  </div>
   
  <div class="col-md-7">
    <input type="radio" name='type' (click)='demoInfo.radio="Btech"' [checked]="'Btech' === demoInfo.radio">Btech
    <input type="radio" name='type' (click)='demoInfo.radio="Mtech"' [checked]="'Mtech' === demoInfo.radio">Mtech
  </div>
  
  <div class="col-md-7">
    <select #selectOption (change)='demoInfo.select=selectOption.value' class='form-control' ngControl='select'>
      <option> select</option>
      <option value='One' [selected]="demoInfo.select==='One'">One Value</option>
      <option value='Two' [selected]="demoInfo.select==='Two'">two Value</option>
      <option value='Three' [selected]="demoInfo.select==='Three'">Three Value</option>
    </select>
  </div>
</form>
<br>
<div class='text-center'>
  <button type="button" [disabled]='!CreateGroup.valid' (click)="addNewGroup(demoInfo)" class="btn btn-primary">Create</button>
</div>

班级方面的代码在这里...

import {Component} from 'angular2/core';
import {CORE_DIRECTIVES, NgClass, FORM_DIRECTIVES, Control, ControlGroup, FormBuilder, Validators} from 'angular2/common';

class DemoInfo{
  name:string;
  password: string;
  radio: any;
  select: any;
}
@Component({
    selector: 'my-app',
    templateUrl: 'mytemplate.html',
    directives: [CORE_DIRECTIVES, FORM_DIRECTIVES] 
})
export class AppComponent { 
  CreateGroup: FormBuilder;
  demoInfo: DemoInfo;
  constructor(fb: FormBuilder){
    this.demoInfo= new DemoInfo(); 
    
    this.CreateGroup = fb.group({
            'name': new Control(this.demoInfo.name, Validators.required),
            'password': new Control(this.demoInfo.password, Validators.required),
            'select': new Control(this.demoInfo.select, Validators.required)
        })
  }
  addNewGroup(demoInfo:demoInfo) {
    console.log(demoInfo, 'whole object');
    this.demoInfo= new DemoInfo();
  }
}

请参考这里的工作plunkr

于 2016-02-27T18:31:59.657 回答
2

尝试new RadioButtonState(boolean, string)在您的表单生成器中使用。

前任。

模板:

<form [ngFormModel]="form" (ngSubmit)="doIt()">
    <h3>DisOrDat</h3>
    <hr />              
    <p>Choose</p>
    <div ngControlGroup="disOrDat">
        <div class="radio">
            <label>
                <input type="radio" name="choose" value="dis" ngControl="dis">Dis                                   
            </label>
            <label>
                <input type="radio" name="choose" value="dat" ngControl="dat">Dat
            </label>
        </div>
    </div>    
</form>

零件

// create the form as a colleciton of Controls
this.form = formBuilder.group({
    disOrDat: formBuilder.group(
        {
            dis: [new RadioButtonState(true, 'dis')],
            dat: [new RadioButtonState(false, 'dat')]
        }, 
        { 
            validator: this.disOrDatValidator 
        }
    )
});

disOrDatValidator(group: ControlGroup) { 
    /* tslint:disable:no-string-literal */
    if (group.controls['dis'].value !== group.controls['dat'].value) {
    /* tsslint:enable:no-string-literal */    
        return false;
    }

    // return null means validation passed
    return null;
}  

doIt() {
    // handle form submit
}
于 2016-02-24T14:23:05.580 回答
1

更新 - ANGULAR2 RC4 表格

(新表格中有很多变化,所以发布为新答案)

angular2 RC Forms 发布后,angular2 表单发生了很多变化。其中一些是重大的重大变化,其中一些可以忽略不计,这里是使用 angular2 形式的一些关键点。

在 Angular 2 中构建表单基本上有两种方法,即模板驱动和模型驱动。使用表格的基本结构如下:-

  • npm install @angular/forms --save
  • 为您的应用程序配置引导方法,如下所示:

    bootstrap(AppComponent, [
      disableDeprecatedForms(), // disable deprecated forms
      provideForms(), // enable new forms module
    ]);
    
  • 使用REACTIVE_FORM_DIRECTIVES组件指令来使用表单功能。

  • 创建类型的表单变量FormGroup
  • 用于Validators验证目的。

除此之外, FormBuilder不是构建模型驱动表单的强制要求,但它简化了语法。formbuilder 提供了三种基本语法/方法:

  • group:构造一个新的表单组。
  • array:构造一个新的表单数组。
  • control:构造一个新的表单控件。

这些是在 angular2 RC 中使用表单的基本步骤。

angular2 形式的有用资源:

现场演示同样在这里

Working Demo for angular2 Forms

于 2016-08-09T18:44:52.107 回答
-2

我的选择是使用ngFormModeland ngControl,因为我们可以更轻松地收集表单数据并且可以进行验证等。

有关更多详细信息,请参阅我的angular2-seeds项目

于 2015-12-25T10:54:07.433 回答