9

パラメータが数値であるかどうかに基づいて、異なるビューとコントローラをロードする必要がある同様のルートがあります。例:

  • /artists/2ArtistsIndexControllerビューを使用する必要があります/www/artists/index.html
  • /artists/nameArtistsProfileControllerビューを使用する必要があります/www/artists/profile.html

理想的には、次のようなものを使用します。

$routeProvider.when("/artists/:page", {
  templateUrl: "/www/artists/index.html",
  controller: "ArtistsIndexController"
});

$routeProvider.when("/artists/:name", {
  templateUrl: "/www/artists/profile.html",
  controller: "ArtistsProfileController"
});

:pageは数字であり、そうで:nameはありません。

関連するgithub の問題(この質問から見つかりました) が表示されますが、解決策または推奨される解決策があるかどうか疑問に思っていることに注意してください。

4

3 に答える 3

5

別の方法は、ルートの正規表現をサポートするui-routerを使用することです (他の多くのものの中でも)。これにより、次のことが可能になります。

$stateProvider.state("artists-index", {
  url: "/artists/{page:[0-9]*}",
  templateUrl: "/www/artists/index.html",
  controller: "ArtistsIndexController"
});

$stateProvider.state("artists-profile", {
  url: "/artists/{name}",
  templateUrl: "/www/artists/profile.html",
  controller: "ArtistsProfileController"
});
于 2013-11-05T19:05:38.373 に答える
3

私は正規表現を変更することからなる厄介なハックを使用します

var $route = $routeProvider.$get[$routeProvider.$get.length-1]({$on:function(){}});


$routeProvider.when("/artists/:page", {
  templateUrl: "/www/artists/index.html",
  controller: "ArtistsIndexController"
});

$routeProvider.when("/artists/:name", {
  templateUrl: "/www/artists/profile.html",
  controller: "ArtistsProfileController"
});

$route.routes['/artist/:page'].regexp = /^\/(?:artist\/(\d+))$/
$route.routes['/artist/:page/'].regexp = /^\/(?:artist\/(\d+))\/$/

醜いですが、うまく機能します。ルートの正規表現を変更して、必要なものに一致させることができます。

于 2014-07-21T12:21:23.647 に答える
1

私は今のところこれを解決策として使用しており、代替案に興味があります!

1) コントローラーにロードして動的に表示する汎用テンプレートを作成します。

<div ng-controller="controller" ng-include src="templateUrl"></div>

この例では、このビューを/www/shared/dynamic-controller.html

2) ルート パラメータをチェックして、ロードするコントローラとビューを決定するコントローラを作成します。

angular.module('appName').
  controller('ArtistsDynamicRouteController', ['$scope', '$controller', '$routeParams', function($scope, $controller, $routeParams) {
    if(/^\d+$/.test($routeParams.pageOrId)) {
      // when pageOrId is a page (number) we want to load the ArtistsIndexController
      $scope.controller = $controller('ArtistsIndexController', { $scope: $scope }).constructor;
      $scope.templateUrl = '/www/artists/index.html';
    } else {
      // when pageOrId is an id (non-number) we want to load the ArtistsProfileController
      $scope.controller = $controller('ArtistsProfileController', { $scope: $scope }).constructor;
      $scope.templateUrl = '/www/artists/profile.html';
    }
  }]);

3) パラメータのタイプに関係なく、1 つのルートを使用します。

// handles both /artists/2 and /artists/username
$routeProvider.when("/artists/:pageOrName", {
  templateUrl: "/www/shared/dynamic-controller.html",
  controller: "ArtistsDynamicRouteController"
});
于 2013-08-08T17:00:54.763 に答える