查询参数更改时,Angular路由器导航不会加载页面

时间:2019-03-13 10:37:54

标签: angular angular-routing

我有一个显示API查询结果的组件。我想添加一个下拉框,以便可以过滤列表,但是当url查询参数更改时,我似乎无法重新加载页面。

<div>
  <H2>Products</H2>
  <form>
    Filter By Manufacturer
    <select (change)="onManufacturerChange($event.target.value)">
      <option value="">All</option>
      <option [value]="m" *ngFor="let m of manufacturers">{{m}}</option>
    </select>
  </form>
  <ul>
    <li *ngFor="let p of products"><B>{{p.manufacturer}}</B> - {{p.name}}</li>
  </ul>
</div>

还有打字稿

export class ProductListComponent implements OnInit {

  public products: Array<object> = [];
  public manufacturers: any = [];
  public manufacturer: string = "";
  public search: string = "";

  constructor(private _assetService: AssetService, private router: Router, private route: ActivatedRoute) { }

  ngOnInit() {
    this.route.queryParams.subscribe(params => {
      console.log(params);
      if('manufacturer' in params){
        this.manufacturer = params.manufacturer;
      }
      if('search' in params){
        this.search = params.search;
      }
    })

    this._assetService.getManufacturers().subscribe(data => {
      this.manufacturers = data;
    })

    this.loadProducts(); 
  }

  loadProducts(){
      this._assetService.getProducts(this.manufacturer,this.search).subscribe((data: ProductListResult) => {
      this.products = data.products;
    }) 
  }

  onManufacturerChange(newValue){
    this.router.navigate(['/products'], {queryParams: {manufacturer: newValue}});
  }
}

当我更改下拉框中选择的项目时,浏览器中显示的URL会更改,但页面不会重新加载。如果我使用所需的URL手动刷新浏览器,则会显示正确的输出。如果我将route.navigate中的路径更改为可以正常工作的完全不同的路由。如果我在路由器导航后添加了对loadProducts()的调用,则会重新加载页面,但其中一个选择会异相。

我读过的所有内容都说,如果ngFor引用的数组发生更改,它应该自动更新DOM,但我似乎无法触发它。我需要调用某种刷新或无效例程来更新DOM吗?我需要在路由器中设置一些内容来识别对查询参数的更改吗?我要把这都弄错了吗?

3 个答案:

答案 0 :(得分:0)

您只需要通过添加一个额外的参数

来更新方法 onManufacturerChange

相对于

onManufacturerChange(newValue){
    this.router.navigate(['/products'], {queryParams: {manufacturer: newValue},relativeTo : this.route});
  }

此处 this.route 将是 ActivatedRoute 的实例, 这将在此处使用动态查询参数更新路由网址,即制造商

因此在ngOnInit内部,您将获得更新的查询参数值

ngOnInit(){
   this.route.queryParams.subscribe(params => {
        const manufacturer = params['manufacturer'];
        console.log('manufacturer',manufacturer);
      });
}

让我知道这是否对您有帮助,编码愉快!!!

答案 1 :(得分:0)

据我所知,当查询参数更改时,没有一种优雅的方法让Angular重新加载页面。

我的代码中的错误是 loadProducts()使用this.manufacturer,所以我需要在 onManufacturerChange()中进行设置。它不会重新加载页面,但是会重新加载数据并更新DOM。

然后我需要创建一个 updateRoute()函数,在订阅从api加载数据后调用该函数。浏览器中的“后退”和“前进”按钮仍然不起作用(浏览URL,但不更新显示内容),但URL和显示否则保持同步。暂时关闭。

  loadProducts() {
    this._assetService.getProducts(this.manufacturer,this.search).subscribe((data: ProductListResult) => {
      this.products = data.products;
      this.updateRoute();
    })
  }

  onManufacturerChange(newValue){
    this.manufacturer = newValue;
    this.loadProducts();
  }

  updateRoute( ){
    var queryParams = {};
    if (this.manufacturer!= "" ){queryParams['manufacturer'] = this.manufacturer;}
    if (this.search!= "" ){queryParams['manufacturer'] = this.search;}
    this.router.navigate(['/products'], {queryParams: queryParams});
  }

答案 2 :(得分:0)

Angular v5 开始,RouteronSameUrlNavigation

中现在有一个选项

如何处理对当前URL的导航请求。其中之一:

  • 'ignore':路由器忽略该请求。

  • 'reload':路由器重新加载URL。用于实现“刷新”功能。

在主应用程序路由文件中,将值设置为'reload'

RouterModule.forRoot(
  routes,
  { onSameUrlNavigation: 'reload' }
)