在编写AngularJS控制器时,我常常想知道编写初始化逻辑的最佳位置。
为了便于说明,我们假设我已将初始化逻辑分离为单独的init()
方法。
据我所知,作为控制器启动的一部分,我有三种方法可以调用它:
init in constructor - 根据other questions的建议解决方案,您可以从构造函数中调用init()
。初始化构造函数在大多数语言中被广泛接受为反模式。我特别反对这个,因为我有用例,我有类继承,并且不希望父构造函数在子构造函数完成之前调用init()
(可能已在子类中重写)执行。
ng-init - 在视图中使用ng-init`指令调用init()
。这不是很好,因为它将我的观点与我的控制器的内部工作结合起来。
从构造函数延迟初始化 - 使用$timeout
服务在 0毫秒延迟后调度init()
。这将允许在调用初始化逻辑之前完全执行子构造函数。
这些解决方案似乎都不是解决这样一个基本问题的过于简洁的方法。有没有我忽略的替代方案?
答案 0 :(得分:1)
如果你保持简单: 每个视图一个状态和一个控制器, 将$stateChangeSuccess事件用于你的初始化事件可能是有意义的。
$scope.$on('$stateChangeSuccess',
function(event, toState, toParams, fromState, fromParams){
// transition completed
// let's init things
})