[还有第二个问题(见下文) - 在一个控制器中设置的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,设置等。
答案 0 :(得分:11)
它似乎永远是"背后的原因"是您在实际的角度页面处理可以运行之前访问$location.path()
。奇怪的是,如果您只添加$timeout
甚至延迟0毫秒,它就会按预期工作。
$timeout(function () {
$scope.currentPath = $location.path();
}, 0);
<强> jsFiddle example 强>
$ rootScope是全局范围,而不是常规$ scope,它基本上是控制器和放大器之间的粘合剂。图。
例如,我在您的第一个控制器中设置$rootScope.test = 123;
,在第二个控制器中,我警告该变量,并获得结果。的 jsFiddle $rootScope example 即可。小心使用$ rootScope,它会创建全局范围的变量