在哪里写控制器初始化逻辑

时间:2015-11-09 11:35:36

标签: angularjs

在编写AngularJS控制器时,我常常想知道编写初始化逻辑的最佳位置。

为了便于说明,我们假设我已将初始化逻辑分离为单独的init()方法。

据我所知,作为控制器启动的一部分,我有三种方法可以调用它:

  • init in constructor - 根据other questions的建议解决方案,您可以从构造函数中调用init()。初始化构造函数在大多数语言中被广泛接受为反模式。我特别反对这个,因为我有用例,我有类继承,并且不希望父构造函数在子构造函数完成之前调用init()(可能已在子类中重写)执行。

  • ng-init - 在视图中使用ng-init`指令调用init()。这不是很好,因为它将我的观点与我的控制器的内部工作结合起来。

  • 从构造函数延迟初始化 - 使用$timeout服务在 0毫秒延迟后调度init()。这将允许在调用初始化逻辑之前完全执行子构造函数。

这些解决方案似乎都不是解决这样一个基本问题的过于简洁的方法。有没有我忽略的替代方案?

1 个答案:

答案 0 :(得分:1)

如果你保持简单: 每个视图一个状态和一个控制器, 将$stateChangeSuccess事件用于你的初始化事件可能是有意义的。

$scope.$on('$stateChangeSuccess', 
function(event, toState, toParams, fromState, fromParams){ 
    // transition completed
    // let's init things
})