我正在尝试逐步建立一个url,但是我做不到。 我解释了这种情况:我实现了一个应用程序,该应用程序使用角形材料的步进器在线(逐步)预订教练。
步骤1:将转到myapp / booking / coachs网址(以获取教练列表)。
第2步:获取教练的ID并将其添加到网址(myapp / booking / coachs / 1)。
第3步:选择日期(myapp / booking / coachs / 1 / date / 2018-07-13),然后选择可用时间->(myapp / booking / coachs / 1 / date / 2018-07-13 / hour / 9)
我可以设法获取教练的ID等,但是我无法逐步构建网址
有人可以指导我正确的方向吗?
答案 0 :(得分:2)
如果将MatStepper
连接到FormGroup
,然后根据表单的当前值设置url,则可以获得预期的功能:
// setup controls
coachIdControl = new FormControl(null, [Validators.required]);
dateControl = new FormControl(null, [Validators.required]);
formGroup = new FormGroup({
coachId: this.coachIdControl,
date: this.dateControl
});
要将表单绑定到url,反之亦然,您可以:
// take values from the url and use to populate the form and set current step
// (you can also use queryMap to use /coach/:id/date/:date url)
// if the user refreshes the page, the form will repopulate from the query
this._route.queryParamMap.subscribe(query => {
if(query.has('coachId') && this.coachIdControl.value !== query.get('coachId')){
this.coachIdControl.setValue(query.get('coachId'));
this.matStepper.selectedIndex = 1;
}
let date = moment.isMoment(this.dateControl.value) ? this.dateControl.value.format('YYYY-MM-DD') : null;
if(query.has('date') && date !== query.get('date')){
this.dateControl.setValue(query.get('date'));
this.matStepper.selectedIndex = 2;
}
this.formGroup.updateValueAndValidity();
});
// if the form changes, update the query params in the url
this.formGroup.valueChanges.subscribe(value => {
this._router.navigate(['.'], {queryParams: {
coachId: value.coachId,
date: moment.isMoment(value.date) ? value.date.format('YYYY-MM-DD') : null
}});
});
完整的示例在这里:StackBlitz - angular-material-routed-stepper
要在后退时删除url查询值,您可以监听selectionChange
事件,并为所选步骤之后的步骤重置值:
this.matStepper.selectionChange.subscribe((event: StepperSelectionEvent) => {
switch(event.selectedIndex){
case 0:
this.dateControl.setValue(null);
case 1:
this.confirmControl.setValue(null);
}
});
(由于switch语句失败,因此所选步骤之后的每一步都会被重置。)
setValue
将依次发出valueChanges
事件,该事件将更新url查询。
上述Stackblitz已使用此功能进行了更新。
答案 1 :(得分:1)
您可以尝试将共享服务添加到可以保留URL的组件,并在完成每个步骤时将其添加到其中。像这样:
$.ajax({
type: "GET",
url: "/amodel/list2",
success: function (r) {
//Do stuff here. This will only execute when request succeed
//r in function parameter is response
},
error: function (r, textStatus, errorThrown) {
//i am using this error handler in ajax method to get
//the status code in my project. hope this will work for you as well
if (r.status === 403) {//do stuff}
if (r.status === 470) {}
}
}).fail(function (e) {
console.log(e.responseText);
}).always(function () {
//Do stuff here which you want always to execute.
// Like hiding ajax loader even if request fails etc
});
因此,将URLService注入到用于构建URL的任何组件中,并且每次添加新项时,请调用export class URLService {
private URL: string[] = [];
public addToURL(segment: string): void {
this.URL = [ ...this.URL, segment ];
}
public retrieveURL(): string {
return this.URL.join('/');
}
}
。然后,当您准备好使用完整的URL时,请致电urlService.addToURL('item')
以获取可以使用的字符串。
答案 2 :(得分:1)