2016-01-29 38 views
19

是否可以更改当前路线中的单个路线参数,同时保留所有其他参数? 这是用于分页组件,它将路由到新页面,同时保持当前路由的其他部分相同。在Angular 2中更改当前路线上的单个路线参数

一些例子:

  • 默认页到第2页:orders?foo=foo&bar=bar>orders?foo=foo&bar=bar&page=2
  • 默认页到第2页(子):orders/;foo=foo;bar=bar>orders/;foo=foo;bar=bar;page=2
  • 页2至3子和父与参数:orders/;foo=foo;page=2?bar=bar>orders/;foo=foo;page=3?bar=bar

我试过用routerLink,但是这会丢失任何原本不属于路由器链路的附加参数。

我已经使用当前Router来获取当前路径的Instruction,但是改变Instruction的参数似乎没有任何效果调用navigateByInstruction()时也试过。

回答

0

为什么你根本就没有做到这一点:

<a [routerLink]="['./Cmp', {limit: 10, offset: 10}]">Previous Page</a> 
<a [routerLink]="['./Cmp', {limit: 10, offset: 20}]">Next Page</a> 
+0

寻呼组件将在许多地方被重新利用,从而使需要的参数传递给routerLink尚不清楚。这也将失去自添加以来已添加的任何附加路线参数(例如,附加过滤器)。 –

0

这是很容易。比方说,我们在我们的ListComponent的方法改变了页面,并保持所有其它参数不变(如搜索相关参数 - 不能更改的页面,忘记我们在寻找的东西:):

page (page) { 
    this.list.page = page; 
    this._router.navigate([this.list.route, _.assign(this._params.params, { page: page })]); 
    this.update(); // Update your list of items here 
} 

我用下划线将一个页面参数分配给我私有的注入RouteParams对象的现有参数映射。该地图在导航上更新,所以我们都很好,只记得你不能直接改变它,它是不可改变的。

这是我实现的文章列表与作为指令提供分页分页组件沿:

ArticleListComponent:

@Component({ 
    selector: 'articles', 
    templateUrl: './article/list/index.html', 
    directives: [PaginationComponent], 
    providers: [ArticleService] 
}) 
export class ArticleListComponent implements OnInit { 
    list: ArticleList = new ArticleList; 

    private _urlSearchParams: URLSearchParams = new URLSearchParams; 

    constructor (
     private _article: ArticleService, 
     private _router: Router, 
     private _params: RouteParams, 
     private _observable: ObservableUtilities 
    ) {} 

    update() { 
     this._observable.subscribe(this._article.retrieveRange(this.list)); 
    } 

    ngOnInit() { 
     let page = this._params.get("page"); 
     if(page) { 
      this.list.page = Number(page); 
     } 

     // check for size in cookie 'articles-per-page' 

     let title = this._params.get("title"); 
     if (title) { 
      this.list.title = title; 
     } 

     this.update(); 
    } 

    size (size: number) { 
     // set cookie 'articles-per-page' 
    } 

    page (page) { 
     this.list.page = page; 
     this._router.navigate([this.list.route, _.assign(this._params.params, { page: page })]); 
     this.update(); 
    } 

    search() { 
     this.list.page = 1; 
     let params = _.pick({ 
      title: this.list.title 
     }, _.identity); 
     this._router.navigate([this.list.route, params ]); 
    } 
} 

PaginationComponent:

import { Component, Input, Output, EventEmitter, OnInit } from 'angular2/core'; 
import { RouteParams } from 'angular2/router'; 
import _ from 'underscore'; 

import { List } from '../common/abstract'; 

@Component({ 
    selector: 'pagination', 
    templateUrl: './pagination/index.html' 
}) 
export class PaginationComponent implements OnInit { 
    @Input() list: List; 
    @Output() change = new EventEmitter<number>(); 

    pages: Array<number> = []; 

    constructor(
     private _params: RouteParams 
    ) {} 

    ngOnInit() { 
     this.pages = _.range(1, this.list.pages + 1); 
    } 

    onClick (page: number) { 
     if (page > 0 && page <= this.list.pages) { 
      this.change.emit(page); 
     } 
     return false; 
    } 

    href (page: number) { 
     return `${this.list.uri}?${_.map(_.assign(this._params.params, { page: page }), (value, param) => `${param}=${value}`).join('&')}`; 
    } 

    first (page) { 
     return page == 1 ? 1 : null; 
    } 

    last(page) { 
     return page == this.list.pages ? this.list.pages : null; 
    } 
} 

分页模板(index.html) - 我使用bootstrap进行造型

<div> 
     <ul class="pagination"> 
      <li [class.disabled]="first(list.page)"><a (click)="onClick(list.page - 1)" [attr.href]="href(list.page - 1)">&laquo;</a></li> 

      <template ngFor let-page [ngForOf]="pages"> 
       <li *ngIf="(page >= list.page - 2 && page <= list.page + 2) || first(page) || last(page)" [ngSwitch]="(page != list.page - 2 && page != list.page + 2) || first(page) || last(page)" [class.active]="page == list.page"> 
        <a *ngSwitchWhen="true" (click)="onClick(page)" [attr.href]="href(page)">{{page}}</a> 
        <a *ngSwitchDefault (click)="onClick(page)" [attr.href]="href(page)">...</a> 
       </li> 
      </template> 

      <li [class.disabled]="last(list.page)"><a (click)="onClick(list.page + 1)" [attr.href]="href(list.page + 1)">&raquo;</a></li> 
     </ul> 
    </div> 

使用在文章列表模板:

... 
<pagination *ngIf="list.pages > 1" [(list)]="list" (change)="page($event)" class="text-center"></pagination> 
... 

在我的小项目中的文章服务请求范围的使用范围头从服务器的文章。

希望对您有所帮助!

1

您可以使用查询参数选项,而不是参数是使用像

在调用的组件调用组件

const navigationExtras: NavigationExtras = { 
    queryParams: { 'param_id': 1, 'param_ids': 2, 'list':[1,2,3] }, 
}; 
this.router.navigate(['/path'], navigationExtras); 

this.route.queryParamMap.map(params => params.get('param_id') || 
    'None').subscribe(v => console.log(v)); 
    this.route.queryParamMap.map(params => params.get('param_ids') || 
     'None').subscribe(v => console.log(v)); 
    this.route.queryParamMap.map(params => params.getAll('list') || 
      'None').subscribe(v => console.log(v)); 
1

如果activeRoute可能,我会很高兴在调用router.navigate(nextroutearray)之前返回当前路由[]的简单克隆,但在api中找不到这样的方法。

因此,我将需求集中到一个简单的服务中,我可以解析当前的activeRoute,以及一组用于下一个路由的参数。我不认为这段代码将覆盖路由中url的所有复杂性,但在我的情况下,我只在路由的最后部分使用参数,因此它适用于我:

服务方法看起来像这样的:

routeFor(activeRoute: ActivatedRoute, params: any): any[] { 
    let result = []; 
    result.push('/'); 
    for (var i = 0; i < activeRoute.pathFromRoot.length; i++) { 
     activeRoute.pathFromRoot[i].snapshot.url.forEach(r => result.push(r.path)); 
    } 

    let currentParams = activeRoute.pathFromRoot[activeRoute.pathFromRoot.length - 1].snapshot.url[0].parameters; 
    for (var n in currentParams) { 
     if (currentParams.hasOwnProperty(n) && !params.hasOwnProperty(n)) { 
      params[n] = currentParams[n]; 
     } 
    } 

    result.push(params); 
    return result; 
} 

然后我可以在任何组件使用此方法让我的网站地图服务注入:

setNextTab(tab: string) { 
    let nextUrl = this.sitemapService.routeFor(this.activatedRoute, { pagetab: tab }); 
    this.router.navigate(nextUrl); 
} 

而在HTML中,链接setNextTab方法是这样的:

<li (click)="setNextTab('myTabName')">Next tab</li>