Angularjs 角度$routeChangeSuccess-比赛条件取决于控制器定义?

Angularjs 角度$routeChangeSuccess-比赛条件取决于控制器定义?,angularjs,Angularjs,我正在听控制器中的$routeChangeSuccess: // In MyController $scope.$on("$routeChangeSuccess", (a, b, c) => { console.log(a, b, c); }); 当应用程序内的导航导致路线发生变化时,这种方法可以很好地工作,但当直接转到浏览器中的URL(例如/my new URL)时,这种方法并不总是有效的 性能取决于控制器的定义位置: <div ng-controller

我正在听控制器中的$routeChangeSuccess:

// In MyController
$scope.$on("$routeChangeSuccess", (a, b, c) => {
            console.log(a, b, c);
});
当应用程序内的导航导致路线发生变化时,这种方法可以很好地工作,但当直接转到浏览器中的URL(例如/my new URL)时,这种方法并不总是有效的

性能取决于控制器的定义位置:

<div ng-controller="MyController"></div>

如果这是在main index.html中,那么它似乎每次都能工作,但是:

<mydirective ng-controller="MyController"></mydirective>

与:

app.directive('myDirective', function() {
  return {
    templateUrl: '<SOME_CONTENT>'
  }
});
app.directive('myDirective',function(){
返回{
templateUrl:“”
}
});
或者实际上:

<mydirective></mydirective>

以及:

app.directive('myDirective',function(){
返回{
控制器:“MyController”,
templateUrl:“”
}
});
后两个只在大约50%的时间里听到$routeChangeSuccess,这可能是由于编译/摘要竞争条件造成的

我更喜欢在指令定义中设置我的控制器——它更整洁,看起来很好地模块化,并且没有多余的标记。不幸的是,它并不经常起作用

作为旁注:我为什么要这样做

我正在与Angular似乎拒绝参与的应用程序设计模式进行斗争——我的应用程序中有许多独立的模块,它们同时都是活动的,我希望它们以适当的方式响应URL更改

我真的不明白为什么这么难做到$routeProvider没有多大用处,因为我每个路由只能有一个视图/控制器——如果我想构建一个单页网站,这很好,但如果我试图构建一个具有复杂UI的单页应用程序,这就不行了。ui路由器插件也不是我真正想要的——它更多的是关于具有可选路由的状态


这是网络-网址是神圣的!我想尊重它,并尽可能多地使用它,我想让我的应用程序中的每个组件或模块都知道基于URL它应该做什么。我不知道为什么Angular会如此困难。

对于任何要捕获事件的组件,必须在偶数升高时将该组件加载到内存中

如果您使用了
ng视图
,并且控制器\指令被定义为在
ng视图
中加载的部分,则您订阅和收听该事件为时已晚。在
ng view
中加载部分时加载的控制器在引发事件时尚未准备好处理该事件


ng视图之外的任何内容
本质上都是全球性的,可以随时订阅此类活动。

感谢您的支持-我开始了解我的问题的原因。我是否认为我的应用程序结构错误?你能推荐一种更好的方法来完成我正在尝试的工作吗?无论在
ng view
中加载什么,都可以被视为具有它所依赖的路由的生命周期。如果有多个模块处于活动状态,则它们不能与视图相关。这些都可以是服务。也许你可以举个具体的例子。
app.directive('myDirective', function() {
  return {
    controller: "MyController",
    templateUrl: '<SOME_CONTENT>'
  }
});