2012-08-13 36 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