2015-10-22 46 views
3

我使用angularjsngRoute委托不同的HTML模板,例如:如何通过angularjs中的查询参数重定向url?

phonecatApp.config(['$routeProvider', 
    function($routeProvider) { 
    $routeProvider. 
     when('/phones', { 
     templateUrl: 'partials/phone-list.html', 
     controller: 'PhoneListCtrl' 
     }). 
     when('/cars', { 
     templateUrl: 'partials/car-detail.html', 
     controller: 'CarDetailCtrl' 
     }); 

    //many more routes 
    }]); 

问题:我想有一个共同的URL,如localhost/my-app?myparam=Nokia

我想比较myparam到映射表。如果参数名称是电话公司,我想要委托给/phones。如果是汽车公司,我想代表/cars等。你明白了。

此外我必须重写URL如下:localhost/myapp/phones?myparam=Nokia。因此ngRoute会自动捕获正确的模板和控制器。

问题:如何拦截初始加载,并根据url参数重定向?

旁注:我不能重写routeProvider配置,例如通过使用不同的插件,如angular-ui-router

回答

3

这听起来像你可能想退后一步并重新考虑你为什么试图以这种方式来解决它,但考虑到你的限制,你最好的选择可能是让一个服务返回正确的URL并从控制器调用它:

phonecatApp.controller("trafficCtrl", function ($routeParams,trafficService,$location) { 
    if ($routeParams.myparam) { 
     var destination = trafficService.getDestination($routeParams.myparam); 
     $location.path(destination); 
    } 
}) 
.service("trafficService", function() { 
    this.getDestination = function (paramValue) { 
     switch(paramValue) { 
      case "Nokia": 
       return "/phones"; 
      case "Ford": 
       return "some/car/url"; 
      // etc... 
     } 
    } 
}); 

另外,你必须添加fol降脂(通用)途径向供应商:

$routeProvider.when("/", { 
     template: '', 
     controller: 'trafficController' 
}); 
+0

但是这种方法会自动将'templates'链接到'controllers'吗?这就是我最喜欢ngroute的原因,明确地将它们链接在一起并通过url路径调用它们。 – membersound

+1

@membersound - 是的。假设myparam是“诺基亚”。它会将用户重定向到partials/phone-list.html,此时$ routeProvider会意识到并知道使用相应的模板和控制器 – Elliott

+0

因此,我必须保留ngRoute的'.config',并另外使用您的servicecontroller方法来调用这些路由?如果是,我如何确保您的控制器在ngRoutes评估之前拦截? – membersound

1

我不知道这是否是正确的解决方案。但是你可以创建一个新的路线/myapp ..写控制器和重定向使用$location服务..使用$location.query()找到查询段值之后,并相应地重定向它

+0

嗯,这是可取的吗?特别是从性能的角度来看? – membersound

+0

我是一个新手..所以我的知识是有限的,但我不认为性能会影响那么多,但如果你正在重定向一个特定的路线。 – raj

+0

你也可以在'angular.run'中写下它,但是我不会推荐它,因为'run'会在控制器运行之前为每个视图加载。所以如果你打开其他网址不需要重定向的代码将运行,但如果每个url用户访问需要重定向,那么你可以考虑运行,因为它会加载任何控制器或指令之前。您可以将重定向代码保留在不同的模块中,并将其导入到原始模块中,并在角度运行中重定向,以便在加载其他元素之前拦截URL。 (我的猜测是性能不会受到影响..但你需要检查一下) – raj

0

如果我们让一个REST调用,比如/我的应用程序内/诺基亚我的应用程序内/三星,而不是查询参数,我想我们可以动态路由它在配置本身。

phonecatApp.config(['$routeProvider', 
    function($routeProvider) { 
    $routeProvider. 
     when('/my-app/:myparam', { 
     templateUrl: function(params){ 
     return TemplateMappingFunction(params.myparam) +'.html' 
    }, 
     controller: function(params){ 
     return ControllerMappingFunction(params.myparam) 
    } 
     }) 

    //many more routes 
    }]); 

例如,

  • 如果URL /我的应用程序内/诺基亚,TemplateMappingFunction(诺基亚)将返回的谐音/电话list.html”,
  • 如果URL如果URL是/my-app/BMW,TemplateM是/my-app/Nokia,TemplateMappingFunction(诺基亚)将返回partials/phone-list.html',
  • appingFunction(BMW)将返回的谐音/汽车details.html”,

查询帕拉姆方法

phonecatApp.config(['$routeProvider', 
      function($routeProvider) { 
      /* Function to retrieve Query parameters*/ 
      function getParameterByName(name) { 
       name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]"); 
       var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"), 
        results = regex.exec(location.search); 
       return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " ")); 
      } 

      $routeProvider. 
       when('/my-app', { 
       templateUrl: TemplateMappingFunction(getParameterByName('myparam')) 
      }, 
       controller: ControllerMappingFunction(getParameterByName('myparam')) 
      } 
       }) 

      //many more routes 
      }]); 

因此,如果URL是本地主机/我的应用程序内?myparam =诺基亚 ,那么TemplateMappingFunction('Nokia')将返回'partials/phone-list.html'

+0

伟大的方法,但不幸的是我没有影响的网址,所以我必须坚持通过查询参数(s)进行评估。 – membersound

+0

在这种情况下,上面的代码(查询参数方法)应该完成这项工作。 – kensplanet

相关问题