簡體   English   中英

如何通過angularjs中的查詢參數重定向url?

[英]How to redirect url by query parameters in angularjs?

我使用ngRouteangularjs委托不同的HTML模板,例如:

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
  }]);

問題:我想擁有一個通用網址,例如localhost/my-app?myparam=Nokia

我想將myparam與映射表進行比較。 如果param名稱是電話公司,我想委托給/phones 如果它是一家汽車公司,我想委托/cars等。你明白了。

另外我必須重寫網址如下: localhost/myapp/phones?myparam=Nokia 因此,ngRoute將自動捕獲正確的模板和控制器。

問題:如何攔截初始加載,並根據url param重定向?

旁注:我無法重寫routeProvider配置,例如使用不同的插件,如angular-ui-router

聽起來你可能想退后一步並重新考慮為什么你試圖以這種方式解決它,但考慮到你的限制,你最好的選擇可能是有一個服務返回正確的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...
        }
    }
});

此外,您必須將以下(通用)路由添加到提供程序:

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

我不知道這是否是正確的解決方案..但你可以創建一個新的路由/myapp ..編寫一個控制器並使用$location服務重定向..使用$location.query()找到查詢參數值並重定向它於是

如果我們將它調用為/ my-app / Nokiamy-app / Samsung而不是Query params,我認為我們可以在配置本身中動態路由它。

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是/ my-app / Nokia ,TemplateMappingFunction(Nokia)將返回partials / phone-list.html',
  • 如果URL是/ my-app / Nokia ,TemplateMappingFunction(Nokia)將返回partials / phone-list.html',
  • 如果網址為/ my-app / BMW ,則TemplateMappingFunction(BMW)將返回partials / car-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是localhost / my-app?myparam = Nokia ,那么TemplateMappingFunction('Nokia')將返回'partials / phone-list.html'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM