2012-08-13 73 views
49

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

回答

88

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

你可以做的是使用一个模块的run()方法在$ rootScope暴露$位置:

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

这将使“位置”的所有模板可用,以便以后你可以做在您的模板:

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

在一个具有自己范围的指令模板中,您需要使用'当前路径:{{$ parent.location.path()}}' – benweet 2014-01-30 22:36:07

+0

使用'{{$ root.location。因为具有隔离作用域的任何指令都不能通过简写方法访问它,并且'$ parent.location'是不可靠的,这取决于你的作用域深度。 '$ root'总是有效的。 – 2016-09-27 16:41:17

0

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

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

为什么downvotes,如果我可能会问? – 2015-11-29 05:00:34

+0

为我工作得很好。 – 2016-01-28 07:53:12

+0

我认为downvotes可能是因为即使OP使用ui-router(单独这个问题几乎没有足够的理由迁移),这将返回状态名称,这通常与URL的路径完全不同(它也将包括任何动态PARAMS)。例如,在我的应用程序中,对于路径:“/ graphs/56ce3/edit”,您的代码将返回状态的名称“edit.graph”。用夸张和半截的话来说“不,看,这个解决方案是针对与我所拥有的问题不同的问题。” :) – 0x24a537r9 2016-02-18 08:09:07