Javascript 重新初始化Angular.js控制器
如果您有一个控制器来操作Angular.js中的$scope变量,有没有一种惯用的方法:Javascript 重新初始化Angular.js控制器,javascript,angularjs,angularjs-scope,angularjs-controller,Javascript,Angularjs,Angularjs Scope,Angularjs Controller,如果您有一个控制器来操作Angular.js中的$scope变量,有没有一种惯用的方法: 重置控制器的$scope,以及 重新启动控制器初始化 对于复杂的控制器,不必将每个变量重置为其初始值是非常方便的,特别是如果您真正想要的是简单地重新初始化控制器和范围。但是,通过$location.path()再次导航到同一URL没有帮助 编辑:假设我不能使用任何$window.locationhack,因为这将违反Chrome打包应用程序中的CSP。在询问之后,我终于找到了一种解决此问题的方法 我仍然
- 重置控制器的$scope,以及
- 重新启动控制器初始化
$location.path()
再次导航到同一URL没有帮助
编辑:假设我不能使用任何
$window.location
hack,因为这将违反Chrome打包应用程序中的CSP。在询问之后,我终于找到了一种解决此问题的方法
我仍然在想,一定会有更优雅的解决方案,但这对我来说绝对有效。如果您使用的是angular ui router,那么您应该这样做:
myapp.Controller('SampleController', function($state) {
$scope.navigate = function (stateName) {
if ($state.is(stateName)) {
$state.reload();
} else {
$state.go(stateName);
}
}
});
我不同意,我认为这是一个完美的解决方案。从某种意义上说,您正在重新加载页面,因此$route.reload()很有意义。@popovitsj:虽然知道这不必被视为不好的做法很好,但我还是不太相信。虽然您肯定是对的,这个解决方案有一些吸引力,因为语义上
$route.reload()
类似于重新加载页面,但它仍然会产生大量开销。在很多特定的用例中,这可能是不可忽略的(在当时它确实在我的用例中),但是如果有一个同样干净的方法来避免产生这种开销,那还是很好的。我们可以在私有方法中移动oninit的内容吗(比如说“init”)然后从oninit调用它,最后使用相同的私有方法来重置控制器,我们想重置多少次就重置多少次?
myapp.Controller('SampleController', function($state) {
$scope.navigate = function (stateName) {
if ($state.is(stateName)) {
$state.reload();
} else {
$state.go(stateName);
}
}
});