Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 重新初始化Angular.js控制器_Javascript_Angularjs_Angularjs Scope_Angularjs Controller - Fatal编程技术网

Javascript 重新初始化Angular.js控制器

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。在询问之后,我终于找到了一种解决此问题的方法 我仍然

如果您有一个控制器来操作Angular.js中的$scope变量,有没有一种惯用的方法:

  • 重置控制器的$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);
        }
    }
});