2013-07-10 8 views
5

Sto lavorando ad un'applicazione di modifica dei file in AngularJS. I miei URL simile a questa:Percorso catch catch di AngularJS?

#/fileName.md/cartella

o

#/fileName.md

o

# nested-cartella/cartella// altro-fol der/itgoesonforever/filename.MD

io non voglio avere a che fare un percorso per ogni singola profondità e potrebbe essere ~ 15 percorsi profonda. Ci sono modi per avere percorsi condizionali? Crudamente:

/:fileorfolder?/:fileorfolder?/:fileorfolder?/:fileorfolder? 
+0

Come il *? (fi – Ven

+0

Scusate? Puoi spiegare? – wesbos

+0

Non ho mai incasinato il routing di Angular, ma ho letto del router del progetto Angular UI: https://github.com/angular-ui/ui-router Questo risponde alle tue esigenze ? –

risposta

15

Credo che il meglio che puoi fare con angolare è *, che è nuovo, come di v1.1.5 of $routeProvider:

path può cont ain gruppi denominati che iniziano con una stella (*name). Tutti i personaggi vengono memorizzati con impazienza nello $routeParams con il nome specificato quando la rotta corrisponde.
Per esempio, percorsi come /color/:color/largecode/*largecode/edit corrisponderanno /color/brown/largecode/code/with/slashes/edit ed estratto:
- color: brown
- largecode: code/with/slashes

che avrebbe dovuto analizzare il largecode param da soli però.

+0

Wow, esattamente quello che volevo. Non devo nemmeno fare nessuna strana adesione dopo il fatto che tutto è passato come singolo parametro. Grazie mille! – wesbos

+2

Ora è stato cambiato in ': nome *' nelle versioni più recenti di angolare. –

6

Penso di averlo capito! Il trucco è impostare il modello su un semplice, quindi modificare l'ambito per includere il percorso dinamico del modello.

Così ora posso inserire un file a /foo/bar/baz.html e vedere il modello reso andando a server.com/foo/bar/baz.

// Routes 
app.config(function($routeProvider) { 
    $routeProvider 

    // Home 
    .when('/', { 
     templateUrl: 'home.html', 
     controller: 'HomeController' 
    }) 

    // Catch All 
    .when('/:templatePath*', { 
     template: '<ng-include src="templatePath"></ng-include>', 
     controller: 'CatchAllCtrl' 
    }) 

}); 

// Catch All Controller 
app.controller("CatchAllCtrl", function($scope, $routeParams) { 
    $scope.templatePath = $routeParams.templatePath + '.html'; 
});