7

I've got a hyper link that I need to make a routerlink in Angular 4. I have a lot of parts to the url, part of which is an array. I'm not sure how to make the array split itself into parts for the routerlink array.

Take this contrived example:

[routerLink]="['/customers', customerid, orderid, arrayofints, anotherint]"

I'd like the router to look like this where customerid = 10, order = 500, arrayofints = [1,2,3], anotherint = 888

"/customers/10/500/1/2/3/888"

I end up with something like this instead:

"/customers/10/500;0=1;1=2;2=3/888"
Darthg8r
  • 12,377
  • 15
  • 63
  • 100

2 Answers2

10

For anything non-trivial, I'd do the work in the component code rather than the template. So in the template:

[routerLink]="customerRouteFor(anotherint)"

and in the component, where you can use the ...spread syntax:

customerRouteFor(anotherint: number): (string | number)[] {
  return ['/customers', this.customerid, this.orderid, ...this.arrayofints, anotherint];
}

This seems rather cleaner than the concat approach, in my view.

jonrsharpe
  • 115,751
  • 26
  • 228
  • 437
  • I think the returned type should be an intersection instead of a union. Typescript Advanced Types[link](https://www.typescriptlang.org/docs/handbook/advanced-types.html): >A union type describes a value that can be one of several types. We use the vertical bar (|) to separate each type, so number | string | boolean is the type of a value that can be a number, a string, or a boolean. Clearly this array will always be a string & number and not either one of them. – A. Alencar Oct 17 '18 at 16:51
  • 1
    @A.Alencar the things in the array are either strings *or* numbers, you can't treat them as both simultaneously as `string & number` would imply. See https://www.typescriptlang.org/docs/handbook/advanced-types.html. – jonrsharpe Oct 17 '18 at 16:54
  • I see. Thanks for clarifying! I thought the returned array was of string AND numbers but the thing is that the each value is defined as number OR string so the array is also of type number OR string. – A. Alencar Oct 17 '18 at 17:07
3

Flattening the arguments will give you the right URL

[routerLink]="[].concat.apply([],['/customers', customerid, orderid, arrayofints, anotherint])"
Rajan Chauhan
  • 1,378
  • 1
  • 13
  • 32