我在控制器中监听$ routeChangeSuccess:
// In MyController
$scope.$on("$routeChangeSuccess", (a, b, c) => {
console.log(a, b, c);
});
当路线因应用内的导航而改变时,此功能正常,但在直接转到浏览器中的网址时并非总是如此/我 - 新网址
性能取决于控制器的定义位置:
<div ng-controller="MyController"></div>
如果这是在主index.html中,它似乎每次都有效:
<mydirective ng-controller="MyController"></mydirective>
with:
app.directive('myDirective', function() {
return {
templateUrl: '<SOME_CONTENT>'
}
});
或确实:
<mydirective></mydirective>
和:
app.directive('myDirective', function() {
return {
controller: "MyController",
templateUrl: '<SOME_CONTENT>'
}
});
后两者仅在50%的时间内听到$ routeChangeSuccess - 可能是由于某些编译/摘要竞争条件。
我更倾向于在指令定义中设置我的控制器 - 它更整洁,看起来非常模块化,并且没有多余的标记。不幸的是,它不经常工作。
作为旁注:为什么我要这样做?
我正在努力应对Angular似乎拒绝玩的应用程序设计模式 - 我的应用程序中有许多单独的模块,它们同时还活着,我想要他们以适当的方式回应URL更改。
我真的不明白为什么这么难实现。 $ routeProvider没有多大用处,因为我每条路线只能有一个视图/控制器 - 如果我想构建一个单页网站,那就太好了,但如果我想要构建单页网站则不行具有复杂UI的单页应用程序。 ui-router插件并不是我正在寻找的 - 它更多地是关于具有可选路由的状态。
这是网络 - 网址是神圣的!我想尊重它并尽可能地使用它,我希望我的应用程序中的每个组件或模块都能根据URL知道它应该做什么。我不确定为什么Angular会这么难。
答案 0 :(得分:0)
对于捕获事件的任何组件,当引发偶数时,必须将该组件加载到内存中。
如果您使用过ng-view
并且控制器\指令被定义为加载ng-view
的部分,那么您订阅和收听该事件为时已晚。部分加载到ng-view
内时加载的控制器尚未准备好在它被引发时处理该事件。
ng-view
以外的任何内容都是全球性的,并且可以随时订阅此类事件。