$ location.path()在第二次点击后更新?

时间:2014-06-10 14:44:39

标签: angularjs

[还有第二个问题(见下文) - 在一个控制器中设置的rootScope变量在第二个兄弟控制器中不可见?]

可能重复: angularjs $location.path only updates URL on second click - 问题的原因和答案在我的更基本的情况下似乎不相关

根据angularjs docs(https://docs.angularjs.org/guide/ $ location):

[The $location service]
Maintains synchronization between itself and the browser's URL when the user
...
Clicks on a link in the page.

我知道$ location.path()反映了浏览器中的当前网址,但当我点击链接更改视图时,表现出奇怪的行为: $ location.path()不会“改变”第一次点击链接,之后每次都会更改为上一次点击的链接

要查看此内容:http://jsfiddle.net/7Ah2W/

我尝试了一种解决方法,我必须使用setter重载手动设置$ location.path()。

在这样做的过程中,我发现了对angularjs的另一个缺陷。我尝试在rootScope中设置一个变量来反映“当前路径”。这个想法是视图会自动检测变量的变化并进行更新。是不是每个范围都继承自rootScope?

这是jsfiddle

为什么我的期望$ rootScope.currentPath,在'NavCtrl'中更改并在'CtrlTwo'中更新?未被满足?

我的最终目标是在点击视图中的链接时自动更改导航栏。与https://console.developers.google.com类似,如果您点击项目,左侧​​的导航将更改为API& Auth,设置等。

1 个答案:

答案 0 :(得分:11)

它似乎永远是"背后的原因"是您在实际的角度页面处理可以运行之前访问$location.path()。奇怪的是,如果您只添加$timeout甚至延迟0毫秒,它就会按预期工作。

    $timeout(function () {
        $scope.currentPath = $location.path();
    }, 0);

<强> jsFiddle example

$ rootScope是全局范围,而不是常规$ scope,它基本上是控制器和放大器之间的粘合剂。图。

例如,我在您的第一个控制器中设置$rootScope.test = 123;,在第二个控制器中,我警告该变量,并获得结果。的 jsFiddle $rootScope example 即可。小心使用$ rootScope,它会创建全局范围的变量