代码之家  ›  专栏  ›  技术社区  ›  Greg Hill

反应式(基于模型)在角度2中形成交叉场验证器

  •  0
  • Greg Hill  · 技术社区  · 8 年前

    我有一个有两个日期字段的表单,我想验证开始日期早于结束日期。非常直接。 我选择用反应式表单而不是模板来实现表单。我正在使用rc5。我已经搜索了很多,看到了带有模板模型指令的示例(目前我选择不使用),但我看到的用于反应式表单的示例似乎不再有效。

    Cross field validation in Angular2

    searchlog.component.html

    <form [formGroup]="logsearchForm" >
    <p-panel>
      <div class="ui-grid ui-grid-responsive ui-grid-pad ui-fluid">
        <div class="ui-grid-row ui-fluid">
          <div class="ui-grid-col-1">Search Logs</div>
          <div class="ui-grid-col-4 ui-fluid">
            <input type="text" pInputText formControlName="searchString"  placeholder="Enter text you want to search"/>
          </div>
          <div>
            <button pButton type="submit" (ngSubmit) = "searchForLogs(logSearchForm.value, logSearchForm.valid)" label="Search" [disabled]="!logsearchForm.valid"></button>
          </div>
        </div>
        <p-panel>
          <div class="ui-grid-row ui-fluid">
            <div class="ui-grid-col-1">Applications:</div>
            <div class="ui-grid-col-2">
              <p-dropdown [options]="applications" formControlName="selectedApp">
              </p-dropdown>
            </div>
    
            <div class="ui-grid-col-1">Users:</div>
            <div class="ui-grid-col-2">
              <p-dropdown [options]="users" formControlName="selectedUser"></p-dropdown>
            </div>
    
          </div>
          <div class="ui-grid-row ui-fluid">
            <div class="ui-grid-col-1">Start Time:</div>
            <div class="ui-grid-col-2">
              <p-calendar formControlName="startDate" dateFormat="mm/dd/yy" timeFormat="HH:mm" timeControlType="select"
                          [horizontalTimeControls]="true"></p-calendar>
    
            </div>
    
            <div class="ui-grid-col-1">End Time</div>
            <div class="ui-grid-col-2">
              <p-calendar formControlName="endDate" dateFormat="mm/dd/yy" timeFormat="HH:mm" timeControlType="select"
                          [horizontalTimeControls]="true">>
              </p-calendar>
            </div>
    
          </div>
        </p-panel>
      </div>
    </p-panel>
    </form>
    

    搜索日志组件.ts

    ....
    
      initControls() {
        this.searchStringControl = new FormControl('', Validators.required);
        this.applicationsControl = new FormControl('');
        this.usersControl = new FormControl('');
        this.startDateControl = new FormControl(this.startDate);
        this.endDateControl = new FormControl(this.endDate);
      }
    
    ....
    
      ngOnInit() {
        this.startDate = this.getCurrentTimeAsString();
        this.endDate = this.getTime24HoursAgoAsString();
    
        this.initControls();
    
        this.logsearchForm = this.fb.group({
          'searchString': this.searchStringControl,
          'selectedApp': this.applicationsControl,
          'selectedUser': this.usersControl,
          'period': this.fb.group({
            'startDate': this.startDateControl,
            'endDate': this.endDateControl
          })
        })
    
      }
    
    ....
    

    即使没有向新的FormGroup添加验证器,我在控制台中也会出现以下错误。

    browser_adapter.js:84ORIGINAL EXCEPTION: Cannot find control with name: 'startDate'
    

    你知道如何做到这一点吗?你可能会认为这是一个非常常见的问题,但我所能找到的答案在Angular 2中不再适用。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Greg Hill    8 年前

    我发现对我有用的一种方法(查看源代码)是:

    this.logsearchForm = new FormGroup({
      'searchString': new FormControl('', Validators.required),
      'selectedApp': new FormControl(''),
      'selectedUser': new FormControl(''),
      'startDate': new FormControl(this.startDate, Validators.required),
      'endDate': new FormControl(this.endDate)
    
    }, {}, this.periodValidator);
    

    下面的验证器(使用moment.js进行日期操作)

    periodValidator(formGroup:FormGroup) {
        let stDt = moment(formGroup.value.startDate, "MM/DD/YYYY HH:mm");
        let endDt = moment(formGroup.value.endDate, "MM/DD/YYYY HH:mm");
        if (stDt < endDt) {
          return null;
        }
        else {
          return {'failedDateValidation': true}
        }
    
      }