AngularJS路由提供者

AngularJS路由提供者,angularjs,Angularjs,在以下代码段中: var root = "default"; app.config(['$routeProvider', function ($routeProvider) { $routeProvider .when("/", {templateUrl: "partials/prototypes.html", controller: "PageCtrl"}) .when("/gmp-01", {templateUrl: setroot("gmp

在以下代码段中:

var root = "default";

app.config(['$routeProvider', function ($routeProvider) {
   $routeProvider
    .when("/",          {templateUrl: "partials/prototypes.html", controller: "PageCtrl"})

    .when("/gmp-01",    {templateUrl: setroot("gmp-01/") , controller: "PageCtrl"} )
    .when("/gmp-02",    {templateUrl: setroot("gmp-02/") , controller: "PageCtrl"} )
    .when("/gmp-03",    {templateUrl: setroot("gmp-03/") , controller: "PageCtrl"} )
    .when("/gmp-04",    {templateUrl: setroot("gmp-04/") , controller: "PageCtrl"} )

    .when("/login",     {templateUrl: constructRoute("login.html") , controller: "PageCtrl"} );
}]);

function setroot(r) {
  root = r; 
  return "partials/" + root + "start-page.html";
}
当我运行应用程序并导航到“/”时,“setroot”会被调用4次,而不管我是否尚未请求“gmp-0x”路由。这将导致根的值设置为“setroot”传入的最后一个参数,在本例中为“gmp-04/”


如何确保仅在请求路由时设置“root”的值

它执行了4次,因为您执行了4次。在覆盖之前,请尝试检查是否设置了
root

var root = null;

app.config(['$routeProvider', function ($routeProvider) {
   $routeProvider
    .when("/",          {templateUrl: "partials/prototypes.html", controller: "PageCtrl"})

    .when("/gmp-01",    {templateUrl: setroot("gmp-01/") , controller: "PageCtrl"} )
    .when("/gmp-02",    {templateUrl: setroot("gmp-02/") , controller: "PageCtrl"} )
    .when("/gmp-03",    {templateUrl: setroot("gmp-03/") , controller: "PageCtrl"} )
    .when("/gmp-04",    {templateUrl: setroot("gmp-04/") , controller: "PageCtrl"} )

    .when("/login",     {templateUrl: constructRoute("login.html") , controller: "PageCtrl"} );
}]);

function setroot(r) {
  if(root === null) {
      root = r; 
  }
  return "partials/" + root + "start-page.html";
}
然而 我不认为这会达到您希望的效果,因为这些方法是在设置路由时执行的,而不是在第一次调用路由时执行的

您最好将templateUrl设置为实际函数:

$routeProvider.when('/gmp/:number', {
   templateUrl: function(urlattr){
       if(root === null) {
           root = urlattr.number; 
       }           
       return '/partials/gmp-' + root + 'start-page.html';
   },
   controller: 'PageCtrl'
};
看到区别了吗?这是未经测试的,但我想你明白要点了