【问题标题】:Find route from angularjs routeprovider by name按名称从 angularjs routeprovider 查找路线
【发布时间】:2014-01-30 08:55:01
【问题描述】:

我正在这样定义我的路线。

$routeProvider
.when('/Home', {
     name: 'Main',
     templateUrl: 'Main.html',
     controller: 'MainController',
     controllerAs: 'ctrl'
})
.when('/About', {
     name: 'About',
     templateUrl: 'About.html',
     controller: 'AboutController',
     controllerAs: 'ctrl'
})

当我在主控制器中时,如何通过查询名称“About”在控制器中找到“/About”URL?

【问题讨论】:

    标签: angularjs angularjs-routing


    【解决方案1】:

    您可以将$location 注入控制器并使用$location.path() 获取URL 或注入$route 以获取路由名称。

    示例:

    function MainCntl($scope,$location,$route) {
      $scope.location = $location.path(); // '/Home'
      $scope.routeName= $route.current.$$route.name; //'Main'
    }
    

    【讨论】:

    • 这将给出当前位置,我需要获取特定页面的 URL - 无需重复字符串值
    • 抱歉我的问题不清楚,我现在已经更新了。如果我在“主页”页面上 - 如何获取“关于”页面的 URL?
    【解决方案2】:

    由于没有内置任何东西,因此扩展路由可以很好地解决这个问题:

    $provide.decorator('$route', ($delegate) => {
    
        $delegate.getRoute = (name) => {
            var result = null;
            angular.forEach($delegate.routes, (config, route) => {
                if (config.name === name) {
                    result = route;
                }
            });
            return result;
        };
    
        return $delegate;
    });
    

    【讨论】:

    • => 的简写符号function(..) 还是由javascript 之上的框架/解释器提供的?
    • 只是为了记录,这不是 CoffeeScript,它是ES6 Harmony
    【解决方案3】:

    检查问题:

    我对此的解决方案如下:

    Object.getPrototypeOf($route.current) === $route.routes['/Home'];
    

    鉴于实例化控制器后路由对象可能为空,您应该使用$routeChangeSuccess 事件,如下所示:

    $rootScope.$on('$routeChangeSuccess', function(e, curr, prev) {
        if (Object.getPrototypeOf($route.current) === $route.routes['/Home']) {
             // do something when route changes to /Home
        }
    
        else if (Object.getPrototypeOf($route.current) === $route.routes['/About']) {
             // do something when route changes to /About
        }
    }
    

    不需要声明额外的属性(尽管如果 angular 允许它会很好)。您只需使用模式字符串。

    正如我在其他 2 个问题中所说,这是没有记录的行为($route.current 和 $route.routes 都有记录,但它们之间的原型继承没有记录),所以请自行使用风险。

    这也适用于 IE9+。

    【讨论】:

      【解决方案4】:

      如果你的目的是切换url路径, 你可以试试这个:

      function MainCntl($scope, $location) {
      
          // put this at where your want to find the '/About' URL
          $location.path('/About'); 
      
      }
      

      【讨论】:

      • 我不想重复 '/About' 字符串,我不想根据它的名字从 $routeProvider 获取它
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多