有没有办法在组件上使用 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()
我正在使用 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()