2015-10-22 47 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

相關問題