Javascript 在更改ui路由器中的路径之前销毁作用域

Javascript 在更改ui路由器中的路径之前销毁作用域,javascript,angularjs,angularjs-scope,angular-ui-router,Javascript,Angularjs,Angularjs Scope,Angular Ui Router,我使用UI路由器路由。当我将路径从一个状态更改为另一个状态并返回到相同的状态时,我看到状态中的旧$scope就在那里(带有它的属性) 我想在状态更改之前销毁$scope,所以当我第二次回到状态时,将有一个全新的作用域。我尝试访问此事件中的作用域: $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) { // fromState.$scope.$

我使用
UI路由器
路由。当我将路径从一个状态更改为另一个状态并返回到相同的状态时,我看到状态中的旧$scope就在那里(带有它的属性)

我想在状态更改之前销毁$scope,所以当我第二次回到状态时,将有一个全新的作用域。我尝试访问此事件中的作用域:

$rootScope.$on('$stateChangeStart', 
   function(event, toState, toParams, fromState, fromParams) {
     // fromState.$scope.$destroy();
});

但是没有任何对$scope的引用。我可以在angular
UI Router
中更改状态之前访问scope吗?

我想说的是,您的体验与您描述的有点不同,或者您认为发生了什么。请检查以下示例:

通常,一旦状态更改完成(未被拒绝),旧的$范围肯定会被销毁。如果我们导航回来,就会为我们创建新的
$scope
。但这个$scope是这样创建的:

的源代码

构造:
作用域。$new()是理解的关键。这实际上意味着,我们使用原型继承

简而言之,可以这样描述:

我们提供了一个
$scope
,它已从其父级克隆了所有属性

因此,如果父级包含如下引用(路径中有“.”

// parent scope
$scope.Model = {
  ...
};
$scope.Model.name = "User";
任何子州都会这样改变

// parent scope
$scope.Model = {
  ...
};
$scope.Model.name = "User";
该值将存储在父项中,并再次可用。。。为了这个州的下一个孩子

注意:如果我们离开状态,
,则可以使用相同的方法来证明这一事实:

    function cleanupLastView() {
      if (previousEl) {
        previousEl.remove();
        previousEl = null;
      }

      if (currentScope) {
        currentScope.$destroy();
        currentScope = null;
      }
      ...
延伸

我用这两种状态创建了:

.controller('ParentCtrl', ['$scope', function ($scope) { 
  $scope.Model = {
    SharedName: "This is shared name",
  }
  $scope.NotSharedName = $scope.NotSharedName 
                      || "This name is cloned, but then lives its own way";
}])
.controller('ChildCtrl', ['$scope', function ($scope) {}])
这两种方法如何更改值(都将遵循上述逻辑):

这将在所有子级和父级之间共享

这将始终从父级复制,然后在每个子级中生存


检查一下

我本来打算在Radim Köhler的帖子上添加一条评论,但由于我没有足够的代表分数,我只想在这里添加一个答案,到目前为止,我使用的唯一解决方案是使用这种方法,避免在控制器范围上添加我不希望由于原型行为而发生冲突的方法/属性

我创建了一个plunker并扩展了我的answser。。希望这将有助于获得更多关于我的景点的细节…@RadimKöhler非常感谢你!我正在研究并阅读您的链接:)