我有一个Angular JS应用程序,其中包含 defaultController 它控制应用程序的标题。然后我有一些其他控制器每个视图一个。视图加载在 <main>.我使用 $routeProvider 用这个代码:

myapp.config(['$routeProvider',
    function($routeProvider) {
        $routeProvider.
            when('/login', {
                templateUrl: 'templates/login.html',
                controller: 'loginController'
            }).
            when('/dashboard', {
                templateUrl: 'templates/dashboard.html',
                controller: 'dashboardController'
            }).
            ...

我试图在加载的视图是仪表板时在标题内显示注销按钮,如果加载的视图是登录视图,则将其隐藏。为了做到这一点,我在 defaultController$location 对象和我正确地添加和删除类从注销按钮与 ng-class.

只有一个问题:$location在我第一次加载页面时给了我正确的路径,但是在我更改视图(由 $routeProvider)该变量不再更新,所以当我实际打开时 /#/dashboard ,的 $location.url 还在继续 /login.这里的控制器代码:

controllers.controller('defaultController', ['$scope', 'ipCookie', '$location', function($scope, ipCookie, $location) {
    $scope.url = $location.url();
    ...

我也试过 $window.location.hash 具有相同的结果。

知道吗?

编辑:在接受的答案之后,这是我在 defaultController 为了使其工作

$scope.$on("$locationChangeSuccess", function() {
        $scope.url = $location.url();      
    });
有帮助吗?

解决方案

加载默认控制器后,该位置可能会在服务中更新。

你可以注射 $location 服务进入范围,并根据它在模板中做出决定(然后它将自动被监视和重新评估),或者您可以侦听 $locationChangeSuccess 事件。

注射时,您可以简单地 $scope.location = $location 然后使用类似的东西 <a ng-hide="location.path() != '/something'">.

$location 广播 $locationChangeSuccess 在根范围上,因此您应该能够在任何可用的范围上侦听它: $scope.$on( "$locationChangeSuccess", function() { /* do something */ } );

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top