Angular $ routeChangeSuccess - 竞争条件取决于控制器定义?

时间:2015-06-10 19:26:05

标签: angularjs

我在控制器中监听$ 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会这么难。

1 个答案:

答案 0 :(得分:0)

对于捕获事件的任何组件,当引发偶数时,必须将该组件加载到内存中。

如果您使用过ng-view并且控制器\指令被定义为加载ng-view的部分,那么您订阅和收听该事件为时已晚。部分加载到ng-view内时加载的控制器尚未准备好在它被引发时处理该事件。

ng-view以外的任何内容都是全球性的,并且可以随时订阅此类事件。