有没有办法在组件上使用 NgbDatepicker 的 navigateTo() 而不是在 ngAfterViewInit() 上使用它?

Is there a way to use NgbDatepicker's navigateTo() on the component other than using it on ngAfterViewInit()?

我正在使用 NgbDatepicker

<ngb-datepicker #dp [(ngModel)]="scheduledStartDate" [ngModelOptions]="{standalone:true}">
</ngb-datepicker>

可以在 ngAfterViewInit() 上完成,例如:

@ViewChild('dp') datepicker: NgbDatepicker;

ngAfterViewInit() {
    this.datepicker.navigateTo({ year: new Date().getFullYear(), month: new Date().getMonth(), day: new Date().getDate() });
}

但是有没有办法在其他功能上使用 navigateTo() ??

您不能使用 NgbDatepicker,直到它被初始化。为了确保它可用,我们有 ngAfterViewInit 钩子。所以如果你想做一些初始化,你可以在 ngAfterViewInit 中进行。但是,如果您仍然想从 view initialisation 之前调用的某个函数中使用它(假设是构造函数,因为您没有向我们展示您从哪里调用它),您可以使用 setTimeout 作为解决方法但我不建议这样做。参见下面的组件 -

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html'
})
export class AppComponent implements AfterViewInit {

  @ViewChild('dp') datepicker: NgbDatepicker;
  scheduledStartDate: NgbDateStruct = {year: 2222, month: 10, day: 10};
constructor(private calendar: NgbCalendar) {
  console.log(this.datepicker? 'NgDatePicker is available': 'NgDatePicker not initialized');
  setTimeout(() => {
    this.datepicker.navigateTo({year:2090, month: 10});
  }, 1000);
}
ngAfterViewInit() {
    console.log(this.datepicker? 'NgDatePicker is available': 'NgDatePicker not initialized');
}
}

请检查 this stackblitz 工作正常的示例。 app.component.html 有两个按钮可以导航到两个不同的年份。

更新:

您也可以在 <ngb-datepicker> -

中使用 startDate
<div *ngIf="addEditForm">
    <ngb-datepicker #dp [(ngModel)]="scheduledStartDate"  [startDate]="scheduledStartDate" (navigate)="date = $event.next" *ngIf="addEditForm"></ngb-datepicker>
 </div>

然后继续更改 scheduledStartDate 而不是使用 this.datepicker.navigateTo({})

openAddForm() {
    this.addEditForm = true;
    this.scheduledStartDate = {year: 5555, month: 10, day: 10};
  }

参考this api document了解更多。

如果您想设置任何特定日期,则:

<ngb-datepicker #dp [(ngModel)]="model" (navigate)="date = $event.next"></ngb-datepicker>

并使用按钮事件:

<button class="btn btn-sm btn-outline-primary mr-2" (click)="dp.navigateTo()">To current month</button>

<button class="btn btn-sm btn-outline-primary mr-2" (click)="dp.navigateTo({year: 2021, month: 2})">To Feb 2021</button>

和在组件中 -

import {NgbDateStruct, NgbCalendar} from '@ng-bootstrap/ng-bootstrap'; export class NgbdDatepickerBasic {

model: NgbDateStruct; date: {year: number, month: number};

constructor(private calendar: NgbCalendar) {}

selectToday() {this.model = this.calendar.getToday();} }

参考https://stackblitz.com/run?file=src%2Fapp%2Fdatepicker-basic.ts

没有 ngAfterViewInit()