2016-01-29 29 views
19

में वर्तमान मार्ग पर एक ही रूट पैरामीटर बदलें, क्या अन्य सभी पैरामीटर को रखते हुए वर्तमान मार्ग में एक ही रूट पैरामीटर बदलना संभव है? यह एक पेजिंग घटक में उपयोग के लिए है, जो वर्तमान मार्ग के अन्य हिस्सों को रखते हुए एक नए पृष्ठ पर रूट करेगा।कोणीय 2

कुछ उदाहरण: पेज 2 के लिए

  • डिफ़ॉल्ट पृष्ठ: orders?foo=foo&bar=bar>orders?foo=foo&bar=bar&page=2
  • डिफ़ॉल्ट पृष्ठ 2 (बच्चे) के लिए पेज: बच्चे और मानकों के साथ माता-पिता पर 3 orders/;foo=foo;bar=bar>orders/;foo=foo;bar=bar;page=2
  • पेज 2 : orders/;foo=foo;page=2?bar=bar>orders/;foo=foo;page=3?bar=bar

मैंनेका उपयोग करने का प्रयास किया है, हालांकि यह किसी भी अतिरिक्त पैरामीटर को खो देता है जो मूल रूप से राउटर लिंक का हिस्सा नहीं है।

मैं भी वर्तमान 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

पेजिंग घटक कई स्थानों पर फिर से उपयोग किया जाएगा, इसलिए राउटरलिंक को पारित करने वाले पैरामीटर ज्ञात नहीं हैं। इससे कोई अतिरिक्त मार्ग पैरामीटर भी खो जाएगा जो बाद में जोड़ा गया है (उदा। अतिरिक्त फ़िल्टर)। –

0

यह काफी आसान है।

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 
} 

मैं प्रयोग किया है: पेज को बदल नहीं सकते और भूल जाओ हम कुछ के लिए :) खोज कर रहे थे - मान लें कि हम अपने ListComponent में एक विधि है कि पेज में परिवर्तन और अन्य सभी मापदंडों बरकरार (खोज से संबंधित मानकों की तरह रहता है चलो अंडरस्कोर मेरे निजी, इंजेक्शन रूटपेरम्स ऑब्जेक्ट से पैरामीटर के मौजूदा मानचित्र को पृष्ठ पैरामीटर असाइन करने के लिए। उस मानचित्र को नेविगेट पर अपडेट किया गया है, इसलिए हम सभी अच्छे हैं, बस याद रखें कि आप इसे सीधे नहीं बदल सकते हैं, यह imutable है।

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) - मैं

012 स्टाइल के लिए बूटस्ट्रैप का उपयोग करता हूं लेख सूची टेम्पलेट में

उपयोग:

... 
<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) पर कॉल करने से पहले छेड़छाड़ करने के लिए वर्तमान मार्ग [] का एक सरल क्लोन वापस करें, लेकिन मुझे एपीआई में ऐसी विधि नहीं मिली।

इसलिए मैंने आवश्यकता को एक सरल सेवा में केंद्रीकृत किया, जहां मैं वर्तमान सक्रिय रूट, + अगले मार्ग के लिए उपयोग किए जाने वाले पैरामीटर का एक सेट पार्स कर सकता हूं। मुझे नहीं लगता कि यह कोड यूआरएल की सभी जटिलताओं को एक मार्ग में शामिल करेगा, लेकिन मेरे मामले में, मैं केवल मार्ग के अंतिम भाग पर पैरामीटर का उपयोग करता हूं, इसलिए यह मेरे लिए काम करता है:

सेवा विधि जैसी दिखती है इस:

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

और html में, setNextTab विधि के लिए लिंक इस तरह दिखता है:

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; 
} 

तब मैं इस विधि किसी भी घटक में हो रही मेरी साइटमैप सेवा इंजेक्शन का उपयोग कर सकते

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