3

我正在用 angular.js 制作一个文件浏览器。所以,我会处理一些长网址,

例如:

mydomain/folder1/sub1/grand-sub1/.././

我只是学习了 angular,发现 angular 有 $routeProvider,但是,似乎我应该写很多“when”来完成这项工作(如果我没有定义“when”,则不会使用模板)。

角度是否支持“*”以使所有子目录的路径都使用相同的模板?

或者,还有其他方法来处理这个吗?谢谢。

4

3 回答 3

2

由于 $routeProvider 目前不支持通配符(请参见此处和答案中的 2 个链接),因此您必须对其进行一些修改...

http://plnkr.co/edit/OuVRSrDUvdVF5yFDHnmM?p=preview

HTML

<a href="#/dir">/</a>
<br/>
<a href="#/dir/folder1">/folder1</a>
<br/>
<a href="#/dir/folder1/sub1">/folder1/sub1</a>
<br/>
<a href="#/dir/folder1/sub1/grandsub1">/folder1/sub1/grandsub1</a>
<br/>

JavaScript

app.controller('DirCtrl', function ($scope, $route) {
  var p = $route.current.params;

  $scope.path = '/';
  if (p.p1) $scope.path += p.p1;
  if (p.p2) $scope.path += '/' + p.p2;
  if (p.p3) $scope.path += '/' + p.p3;
  if (p.p4) $scope.path += '/' + p.p4;
  if (p.p5) $scope.path += '/' + p.p5;
});

app.config(function ($routeProvider) {
  $routeProvider
    .when('/', {templateUrl: 'home.html', controller: 'HomeCtrl'})
    .when('/dir', {templateUrl: 'dir.html', controller: 'DirCtrl'})
    .when('/dir/:p1', {templateUrl: 'dir.html', controller: 'DirCtrl'})
    .when('/dir/:p1/:p2', {templateUrl: 'dir.html', controller: 'DirCtrl'})
    .when('/dir/:p1/:p2/:p3', {templateUrl: 'dir.html', controller: 'DirCtrl'})
    .when('/dir/:p1/:p2/:p3/:p4', {templateUrl: 'dir.html', controller: 'DirCtrl'})
    .when('/dir/:p1/:p2/:p3/:p4/:p5', {templateUrl: 'dir.html', controller: 'DirCtrl'})
    /* add more as necessary */
    .otherwise({redirectTo: '/'});
});
于 2013-05-17T03:33:48.760 回答
1

从 AngularJS 1.2 开始(目前处于候选发布阶段),您可以使用通配符来匹配更多路径。从新文档中:

path可以包含以冒号开头并以星号 ( :name*) 结尾的命名组。$routeParams当路由匹配时,所有字符都急切地存储在给定名称下。

例如,像这样的路由/color/:color/largecode/:largecode*\/edit将匹配/color/brown/largecode/code/with/slashs/edit并提取:

color: brown
largecode: code/with/slashs.

现在必须包含额外的angular-route.js文件毫无价值,因为默认情况下不再包含路由层以节省文件大小。此外,您的模块必须声明ngRoute为其依赖项之一。您的代码如下所示:

var app = angular.module('app', ['ngRoute']);

app.controller('HomeCtrl', function ($scope, $route) {
});

app.controller('DirCtrl', function ($scope, $routeParams) {
  $scope.path = '/' + $routeParams.dir;
});

app.config(function ($routeProvider) {
  $routeProvider
    .when('/', {templateUrl: 'home.html', controller: 'HomeCtrl'})
    .when('/dir/:dir*', {templateUrl: 'dir.html', controller: 'DirCtrl'})
    .otherwise({redirectTo: '/'});
});

工作示例:http ://plnkr.co/edit/BSPWYPnHM7GJRgNCAjoi?p=preview

于 2013-09-21T23:00:11.680 回答
1

不要重复自己!

var dirRoute = {templateUrl: 'dir.html', controller: 'DirCtrl'};

$routeProvider
  .when('/', {templateUrl: 'home.html', controller: 'HomeCtrl'})
  .when('/dir', dirRoute)
  .when('/dir/:p1', dirRoute)
  .when('/dir/:p1/:p2', dirRoute)
  .when('/dir/:p1/:p2/:p3', dirRoute)
  .when('/dir/:p1/:p2/:p3/:p4', dirRoute)
  .when('/dir/:p1/:p2/:p3/:p4/:p5', dirRoute)
于 2013-09-21T22:49:27.730 回答