2017-07-30 2 views
1

Angular prend en charge les routes principales en tant qu'attributs de chaîne.Navigation vers l'URL de l'itinéraire secondaire pour l'attribut routerLink

à savoir

<button routerlink="/path1">Click Me!</button> 

Cependant, quand il y a plusieurs points de vente, l'ajout d'une voie secondaire ne fonctionne pas:

<button routerlink="/path1(foo:/path2)">Click Me!</button> <<-- does not work 

est-il un moyen de faire ce travail?

Note: Je me rends compte de son possible pour y parvenir avec:

<a [routerLink]="['/path1', { outlets: { foo: '/path2' } }]">Click Me!</a> 

Ma question est plus de savoir si cela est possible en utilisant des attributs de chaîne simple (le cadre du routeur pourrait l'analyser dans les coulisses).

+0

Je pense que vous pouvez aussi utiliser [** navigateByUrl **] (https://angular.io/api/router/Router/#usage-2) comme ceci 'router.navigateByUrl ("/path1/foo/path2 ");' –

+0

hey, a fait [ma réponse] (https://stackoverflow.com/a/45396457/2545680) aide? –

Répondre

2

Cela ne semble pas possible avec l'implémentation actuelle du routeur. Lorsque vous passez une chaîne à un routerLink il est enveloppé dans un tableau ici:

@Directive({selector: ':not(a)[routerLink]'}) 
export class RouterLink { 
    ... 

    } 

    @Input() 
    set routerLink(commands: any[]|string) { 
    if (commands != null) { 
     this.commands = Array.isArray(commands) ? commands : [commands]; <--------------- 
    } else { 
     this.commands = []; 
    } 
    } 

Et here is la fonction qui tente d'analyser les enveloppées commands et points de vente extrait:

function getOutlets(commands: any[]): {[k: string]: any[]} { 
    if (!(typeof commands[0] === 'object')) return {[PRIMARY_OUTLET]: commands}; 
    if (commands[0].outlets === undefined) return {[PRIMARY_OUTLET]: commands}; 
    return commands[0].outlets; 
} 

Comme vous peut voir, si la valeur à l'intérieur de la commands enveloppé n'est pas un objet - ce qui est votre cas, il utilise toujours primary sortie et utilise la valeur comme un chemin pour cette sortie principale:

if (!(typeof commands[0] === 'object')) return {[PRIMARY_OUTLET]: commands}; 
+1

J'ai enquêté il y a longtemps et vous semblez avoir raison. Nous ne pouvons pas utiliser de chaîne dans 'routerLink' pour naviguer vers le chemin' outlets' mais avec array il pourrait être fait – yurzui