Angular 数据未更改时,可观察到的角度11路由器数据未更新

Angular 数据未更改时,可观察到的角度11路由器数据未更新,angular,rxjs,observable,subscribe,Angular,Rxjs,Observable,Subscribe,我有一个角度分解器: @Injectable() 导出类DataResolver实现解析{ 构造函数(私有apiService:apiService){} 公共解析(路由:ActivatedRouteSnapshot):任意{ 常数数据={ param1:route.queryParamMap.get('param1'), param2:route.queryParamMap.get('param2'), }; 返回此.apiService.search(数据); } } apiService

我有一个角度分解器:

@Injectable()
导出类DataResolver实现解析{
构造函数(私有apiService:apiService){}
公共解析(路由:ActivatedRouteSnapshot):任意{
常数数据={
param1:route.queryParamMap.get('param1'),
param2:route.queryParamMap.get('param2'),
};
返回此.apiService.search(数据);
}
}
apiService.search方法如下所示:

{
  component: HomeComponent,
  path: '/',
  resolve: {
    data: DataResolver,
  },
  runGuardsAndResolvers: 'paramsOrQueryParamsChange',
}
公共搜索(数据):可观察{
设params=newhttpparams();
for(常量输入数据){
if(data.hasOwnProperty(key)){
常量值=数据[键];
如果(值){
参数=参数集(键、值);
}
}
}
返回这个.http.get(`${API_URL}/endpoint`,{params});
}
然后我有一个组件订阅
ActivatedRoute
数据上的更改:

route.data.subscribe((数据)=>{
控制台日志(数据);
});
路线是这样的:

{
  component: HomeComponent,
  path: '/',
  resolve: {
    data: DataResolver,
  },
  runGuardsAndResolvers: 'paramsOrQueryParamsChange',
}
问题是,无论是否调用了解析器的
resolve
方法,只有当
数据实际更改时才会调用订阅处理程序。特别是,如果两个(或更多)后续的resolve调用解析空数组,则只会在第一次调用行
console.log(data)

这是预期的行为吗?我可以强制可观察对象发出一个新值吗


我的目标是每次解析解析空数组时都显示一条消息,而不管它以前是否为空。

您不必要地将可观察对象包装在承诺中并解析了它。试着像这样重写你的解析器

@Injectable()
导出类DataResolver实现解析{
构造函数(私有apiService:apiService){}
公共解析(路由:ActivatedRouteSnapshot):任意{
常数数据={
param1:route.queryParamMap.get(“param1”),
param2:route.queryParamMap.get(“param2”),
};
返回此.apiService.search(数据);
}
}
我还将考虑使用httppram清理您的API服务

//从'@angular/common/http'导入{HttpClient,HttpParams};
公共搜索(数据):可观察{
设params=newhttpparams({fromObject:data});
返回这个.http.get(`${API_URL}/endpoint`,{params});
}
您可能需要将解析器添加到路由表中

RouterModule.forRoot([{
路径:“你的路线”,
组件:您的组件,
决心:{
您的数据将位于属性:DataResolver
}
}])
如果要重新加载组件,可能需要更改路由器模块中的
onSameUrlNavigation
属性

@NgModule({
导入:[RouterModule.forRoot(路由,{onNameUrlNavigation:'reload'}],
导出:[路由模块]
})
导出类AppRoutingModule{}

我不建议对您的问题使用
onSameUrlNavigation
,只建议订阅
route.queryParams
observable并在那里触发搜索

在您的组件中

ngOnInit(){
this.sub=this.route.queryParams.subscribe(()=>{this.data=this.route.snapshot.data.data;});
//别忘了退订
}

您能否描述一下,无论您的实现如何,您都在尝试接受什么?是否希望每次从服务器获取数据时都显示一条消息?路由更改是如何影响的?@noamsteiner是的,就像我说的,每次服务器的响应为空数组时,我都想显示一条消息,这与路由更改相关的方式如下:当用户执行新搜索时,他们会被重定向到一个URL,搜索参数作为查询参数,所以resolve方法实际上从URL获取这些参数,然后将请求发送到服务器(为了简洁起见,我从代码示例中删除了这个,我将把它添加回去),在代码中调用
resolve
方法?另外,如果您可以添加
搜索
方法代码,这会很有帮助。@noamsteiner我不是在调用
解析
方法,Angular在每次加载特定路由时都会调用它,我已经确认解析方法确实被调用,只是订阅处理程序没有。我已经添加了请求的代码,包括整个解析器。谢谢!这稍微清理了我的代码,但并不能解决我的问题。路线表中有什么?将路线代码添加到问题中。同样,解析程序工作正常,问题是,我订阅了它的数据流,并且该流似乎只有在数据发生变化时才会发出值,我需要知道每次调用解析程序时,路由器都会调用解析程序。每次导航到
/
路线时都会调用它。路由器导航代码中有哪些内容?我不建议您使用
onSameUrlNavigation
,但只需订阅
route.queryParams
observable并在那里触发搜索。