【问题标题】:AngularJS: how can I get $location.path to templateAngularJS:我怎样才能获得模板的 $location.path
【发布时间】:2012-08-13 13:27:20
【问题描述】:

我需要模板中 url 的当前路径($location.path 的内容)。但不是通过控制器,因为我有很多控制器(而且我不想重复声明$scope.currentUrl = $location.path;)。谢谢你的建议。

【问题讨论】:

    标签: angularjs


    【解决方案1】:

    AngularJS 模板只能查看范围内可用的内容,因此您需要以某种方式将 $location 服务放入范围内。 AngularJS 应用程序中有一个始终可用的范围,称为 $rootScope,因此它可以用于您的用例。

    您可以做的是使用模块的 run() 方法在 $rootScope 中公开 $location:

    var myApp = angular.module('myApp', []).run(function($rootScope, $location) {
        $rootScope.location = $location;
    });
    

    这将使“位置”在所有模板中都可用,以便稍后您可以在模板中执行:

    Current path: {{location.path()}}
    

    【讨论】:

    • 在有自己作用域的指令模板中,需要使用Current path: {{$parent.location.path()}}
    • 使用{{ $root.location.xxx }} 是一个好习惯,因为任何具有隔离范围的指令都无法通过速记方法访问它,并且$parent.location 不可靠,具体取决于您的范围深度。 $root 始终有效。
    【解决方案2】:

    另一种方法是使用更语义化和通用的ui-router,然后在控制器中retrieve the current state,并将其存储在$scope上:

    app.controller('MyCtrl', ['$scope', '$state', function MyCtrl($scope, $state) {
      $scope.state = $state.current.name;
      ...
    }
    

    【讨论】:

    • 我认为反对票可能是因为即使 OP 使用的是 ui-router(仅此问题不足以迁移),它返回的状态名称通常与 URL 的路径完全不同(其中还将包括任何动态参数)。例如,在我的应用程序中,对于路径:“/graphs/56ce3/edit”,您的代码返回状态名称“edit.graph”。用 Hyperbole and a Half 的话来说:“不,你看,这个解决方案是针对与我的问题不同的问题。” :)
    • 对于这个线程的未来读者使用 ui-router,你可能想要$state.href($state.current),而不是$state.current.name
    猜你喜欢
    • 2011-06-04
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 2023-03-21
    • 2017-08-12
    • 1970-01-01
    相关资源
    最近更新 更多