Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 反应形式的NgbDatepicker:设置初始值_Angular_Date_Angular Bootstrap_Reactive Forms_Ngb Datepicker - Fatal编程技术网

Angular 反应形式的NgbDatepicker:设置初始值

Angular 反应形式的NgbDatepicker:设置初始值,angular,date,angular-bootstrap,reactive-forms,ngb-datepicker,Angular,Date,Angular Bootstrap,Reactive Forms,Ngb Datepicker,这可能是一段时间以来我处理过的最令人沮丧的问题之一。一般来说,日期,尤其是NgbDatepicker,在角度上有点难处理 我正在Angular 8中针对被动表单实现NgbDatepicker,问题的要点是我可以设置日期控件的初始值,但初始值不会在表单上直观显示。我可以将表单记录到控制台,并查看值是否已设置,但表单字段本身不会更新。如果我从选择器本身选择了一个日期,那么我的选择将反映在表单字段中。我原以为它会像设置ngbDatepicker输入的[startDate]属性一样简单,但显然不是。我在

这可能是一段时间以来我处理过的最令人沮丧的问题之一。一般来说,日期,尤其是NgbDatepicker,在角度上有点难处理

我正在Angular 8中针对被动表单实现NgbDatepicker,问题的要点是我可以设置日期控件的初始值,但初始值不会在表单上直观显示。我可以将表单记录到控制台,并查看值是否已设置,但表单字段本身不会更新。如果我从选择器本身选择了一个日期,那么我的选择将反映在表单字段中。我原以为它会像设置ngbDatepicker输入的[startDate]属性一样简单,但显然不是。我在这方面尝试了很多不同的迭代;以下是代码方面的情况:

我的HTML:

<input #licenseExpiration="ngbDatepicker"
    class="form-control"
    fromControlName="licenseExpiration"
    [startDate]="startDate"
    ngbDatepicker />
<button class="btn btn-info zero-spacing pt-1 pr-1 pl-1"
    (click)="licenseExpiration.toggle()"
    type="button">
上面的HTML驻留在由该CertForm类型指定的formGroup中。该表单包含日期控件,部分外观如下:

export class CertForm extends FormGroup {
  public dateParser: CustomDateParserFormatter;

  constructor(
    cert: ICertModel = new CertModel()) {
    super({
      ..
      licenseExpiration: new FormControl("", Validators.required),
      ..
    });
  }

  setModel(cert: ICertModel) {
    this.patchValue({
      licenseExpiration
    });
  }

  getModel(): ICertModel {
    const cert = new CertModel();
    ...
    cert.licenseExpiration = this.get("licenseExpiration").value;
    ...
    return cert;
  }
}
从那里我有了自定义的解析器/格式化程序设置,它看起来就像NGB示例页面上的规范:

@Injectable({
  providedIn: "root"
})
export class CustomDateParserFormatter extends NgbDateParserFormatter {

  readonly DELIMITER = '/';

  parse(value: string): NgbDateStruct | null {
    if (value) {
      let date = value.split(this.DELIMITER);
      return {
        day: parseInt(date[0], 10),
        month: parseInt(date[1], 10),
        year: parseInt(date[2], 10)
      };
    }
    return null;
  }

  format(date: NgbDateStruct | null): string {
    return date ? date.month + this.DELIMITER + date.day + this.DELIMITER + date.year : '';
  }
}
再说一次,这似乎不允许我用一个可见的启动值启动日期字段。正如你所看到的,在这一点上,我只是硬编码了一个开始日期的返回值。这个日期确实被正确地设置了——当你打开选择器时,它就是到达的日期,但是当你到达页面时,它实际上不会显示在显示字段中。在您实际选择一个值之前,它是空的

我尝试了这么多不同的想法组合,但没有任何效果。这令人难以置信地沮丧。我看到这个问题的变体/片段确实已经存在,但我找不到使用这种技术组合提出这个问题的例子。大多数人在使用NgbDatepicker时似乎依赖模板表单,而不是反应表单。

date picker上的StartData属性未设置初始值。您应该将formControl的值设置为所需的值

这是一个没有解析器的示例。我在工作中使用了一个自定义解析器/格式化程序,它确实可以工作,但我不能在这里发布该代码

工作stackblitz注意:这是最新的Angular和NgBootstrap

应用程序组件

formGroup=新的formGroup{}; 恩戈尼特{ console.log'oninit'; this.formGroup.addControltest,新表单控件{日期:20,月份:4,年份:1969}//nice this.formGroup.valueChanges.subscribebeval=>{ console.logval; } console.logthis.formGroup.value; } 模板

打开 如果您的解析器仍然存在问题,请确保您同时拥有NgbDateParserFormatter和NgbDateAdapter,并且如果日期选择器上的startDatae属性未设置初始值,则适配器可以正确转换您要设置的初始值。您应该将formControl的值设置为所需的值

这是一个没有解析器的示例。我在工作中使用了一个自定义解析器/格式化程序,它确实可以工作,但我不能在这里发布该代码

工作stackblitz注意:这是最新的Angular和NgBootstrap

应用程序组件

formGroup=新的formGroup{}; 恩戈尼特{ console.log'oninit'; this.formGroup.addControltest,新表单控件{日期:20,月份:4,年份:1969}//nice this.formGroup.valueChanges.subscribebeval=>{ console.logval; } console.logthis.formGroup.value; } 模板

打开
如果您的解析器仍然存在问题,请确保您同时拥有NgbDateParserFormatter和NgbDateAdapter,并且您要将其设置为的初始值可以由适配器正确转换(如果不是Ngb日期对象)

谢谢。这并不是我具体案例的答案,但你在这里介绍的东西让我想到了这一点。一些问题正在发生。虽然我的OP代码示例没有显示它,但除了解析器/格式化程序之外,我还有一个自定义的NgbDateAdapter。我发现问题确实与那些返回格式不正确的值的方法有关。我想我现在有了。它似乎起作用了。谢谢你让我走上正轨。请与我们分享你的解决方案。我也有同样的问题。这并不是我具体案例的答案,但你在这里介绍的东西让我想到了这一点。一些问题正在发生。虽然我的OP代码示例没有显示它,但除了解析器/格式化程序之外,我还有一个自定义的NgbDateAdapter。我发现问题确实与那些返回格式不正确的值的方法有关。我想我现在有了。它似乎起作用了。谢谢你让我走上正轨。请与我们分享你的解决方案。我也有同样的问题
@Injectable({
  providedIn: "root"
})
export class CustomDateParserFormatter extends NgbDateParserFormatter {

  readonly DELIMITER = '/';

  parse(value: string): NgbDateStruct | null {
    if (value) {
      let date = value.split(this.DELIMITER);
      return {
        day: parseInt(date[0], 10),
        month: parseInt(date[1], 10),
        year: parseInt(date[2], 10)
      };
    }
    return null;
  }

  format(date: NgbDateStruct | null): string {
    return date ? date.month + this.DELIMITER + date.day + this.DELIMITER + date.year : '';
  }
}