我试图从url获取startdate.网址看起来像http:// sitename/booking?startdate = 28-08-2017 下面是我的代码
aap.module.ts
import {...};
@NgModule({
declarations: [
AppComponent, ModalComponent
],
imports: [
BrowserModule,
FormsModule,
HttpModule,
JsonpModule,
ReactiveFormsModule,
RouterModule.forRoot([{
path: '',
component: AppComponent
},
]),
],
providers: [ContactService, AddonService, MainService],
bootstrap: [AppComponent]
})
export class AppModule { }
Run Code Online (Sandbox Code Playgroud)
aap.component.ts
import {...}
import {Router, ActivatedRoute, Params} from '@angular/router';
constructor(private activatedRoute: ActivatedRoute) {
// subscribe to router event
this.activatedRoute.queryParams.subscribe((params: Params) => {
console.log(params);
});
}
Run Code Online (Sandbox Code Playgroud)
它通过以下错误给出
未处理的承诺拒绝:没有基本的href设置.请提供APP_BASE_HREF标记的值或向文档添加基本元素.; 区域:; 任务:Promise.then; 值:错误:没有设置基本href.请提供APP_BASE_HREF标记的值或向文档添加基本元素.
角度应该如何知道基础href?
将ActivatedRouteSnapshot注入组件不起作用(也没有注入ActivatedRoute).这里的堆栈跟踪:
"Error: Can't resolve all parameters for ActivatedRouteSnapshot: (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?).
at SyntaxError.ZoneAwareError (http://localhost:4200/polyfills.bundle.js:7042:33)
at SyntaxError.BaseError [as constructor] (http://localhost:4200/vendor.bundle.js:73735:16)
at new SyntaxError (http://localhost:4200/vendor.bundle.js:6140:16)
at CompileMetadataResolver._getDependenciesMetadata (http://localhost:4200/vendor.bundle.js:19345:31)
at CompileMetadataResolver._getTypeMetadata (http://localhost:4200/vendor.bundle.js:19220:26)
at CompileMetadataResolver._getInjectableMetadata (http://localhost:4200/vendor.bundle.js:19208:21)
at CompileMetadataResolver.getProviderMetadata (http://localhost:4200/vendor.bundle.js:19450:40)
at http://localhost:4200/vendor.bundle.js:19408:49
at Array.forEach (native)
at CompileMetadataResolver._getProvidersMetadata (http://localhost:4200/vendor.bundle.js:19375:19)
at CompileMetadataResolver.getNonNormalizedDirectiveMetadata (http://localhost:4200/vendor.bundle.js:18848:30)
at CompileMetadataResolver._loadDirectiveMetadata (http://localhost:4200/vendor.bundle.js:18736:23)
at http://localhost:4200/vendor.bundle.js:18937:54
at Array.forEach (native)
at CompileMetadataResolver.loadNgModuleDirectiveAndPipeMetadata (http://localhost:4200/vendor.bundle.js:18936:41)"
Run Code Online (Sandbox Code Playgroud)
在组件中,ActivatedRouteSnapshot注入如下:
constructor([...], private router: Router,
private route: ActivatedRouteSnapshot) {
[...]
}
Run Code Online (Sandbox Code Playgroud)
ActivatedRouteSnapshot提供于app.component.ts:
@Component({ …Run Code Online (Sandbox Code Playgroud) 我已经设置了以下路由系统
export const MyRoutes: Routes = [
{path: '', redirectTo: 'new', pathMatch: 'full'},
{path: ':type', component: MyComponent}
];
Run Code Online (Sandbox Code Playgroud)
并有以下导航系统
goToPage('new');
goToPageNo('new', 2);
goToPage(type) {
this.router.navigate([type]);
}
goToPageNo(type, pageNo) {
this.router.navigate([type], {queryParams: {page: pageNo}});
}
Run Code Online (Sandbox Code Playgroud)
示例网址如下所示
有时他们有可选的 queryParams(页面)
现在我需要读取route params和queryParams
ngOnInit(): void {
this.paramsSubscription = this.route.params.subscribe((param: any) => {
this.type = param['type'];
this.querySubscription = this.route.queryParams.subscribe((queryParam: any) => {
this.page = queryParam['page'];
if (this.page)
this.goToPageNo(this.type, …Run Code Online (Sandbox Code Playgroud) 我正在尝试测试访问子级路由参数的Angular Resolver。
我的后卫工作正常,但是我无法轻松创建单元测试,因为我无法创建ActivatedRouteSnapshot带有子级路由(只读属性)。
我的解析器
@Injectable({
providedIn: 'root'
})
export class MyResolverGuard implements Resolve<string> {
constructor() {
}
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): string {
return route.firstChild.paramMap.get('my-param');
}
}
Run Code Online (Sandbox Code Playgroud)
我的测试:
it('should resolve chilren route params', () => {
guard = TestBed.get(MyResolverGuard);
const route = new ActivatedRouteSnapshot();
// Cannot assign children because it's a read only property
route.children = [...];
const myResolverParams = guard.resolve(route, null);
});
Run Code Online (Sandbox Code Playgroud)
除了使用模拟以外,还有其他方法ActivatedRouteSnapshot吗?
我的测试后卫方法好吗?
感谢您分享您的策略。
javascript angular angular-router angular-test angular-testing
Angular Routing文档提到了组件实例创建,组件实例激活和路由激活.
文档没有解释这些概念的差异,以及何时发生每个创建/激活.
总结:目前尚不清楚组件实例激活和路由激活的真正含义,以及它与组件实例创建的关系(特别是时序方面).
实例创建
实例激活
路线激活
以下是Angular文档中对上述三个概念的一些提及:
实例创建
默认情况下,路由器在重新导航到相同的组件类型时重新使用组件实例,而不首先访问其他组件.
...
此应用程序不会重复使用HeroDetailComponent.用户始终返回到英雄列表以选择要查看的另一个英雄.没有访问其中的列表组件,无法从一个英雄细节导航到另一个英雄细节.因此,路由器每次都会创建一个新的HeroDetailComponent实例.
实例激活
当浏览器的位置URL更改为与路径段/危机中心匹配时,路由器将激活 CrisisListComponent 的实例并显示其视图.
当应用程序请求导航到路径/危机中心时,路由器会激活 CrisisListComponent 的实例,显示其视图,并使用该路径的URL更新浏览器的地址位置和历史记录.
路线激活
第三条路径中的data属性是存储与此特定路由关联的任意数据的位置.在每个激活的路由中都可以访问data属性.
您还可以使用CanActivateChild防护来保护子路线.CanActivateChild后卫与CanActivate后卫相似.关键的区别在于它在激活任何子路由之前运行.
在英雄细节和危机细节中,应用程序一直等到路线被激活以获取相应的英雄或危机.
如果您通过保护检查,ActivatedRouteSnapshot包含将被激活的未来路由,并且RouterStateSnapshot包含应用程序的未来RouterState.