Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.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 角度控制系统中的控制器生命周期_Javascript_Angularjs_Angular Ui Router - Fatal编程技术网

Javascript 角度控制系统中的控制器生命周期

Javascript 角度控制系统中的控制器生命周期,javascript,angularjs,angular-ui-router,Javascript,Angularjs,Angular Ui Router,我使用ui路由器定义了我的应用程序状态: $stateProvider .state('app', { abstract: true, views: { 'nav@': { templateUrl: 'app/navbar.html', controller: 'NavbarController', controllerAs: 'vm' }, 'main@': { templa

我使用ui路由器定义了我的应用程序状态:

$stateProvider
  .state('app', {
    abstract: true,
    views: {
      'nav@': {
        templateUrl: 'app/navbar.html',
        controller: 'NavbarController',
        controllerAs: 'vm'
      },
      'main@': {
        template: '<div ui-view></div>'
      }
    }
  })
  .state('child1', {
    url: '/child1',
    parent: 'app',
    templateUrl: 'app/child1.html',
    controller: function($timeout) {
      $timeout(function() {
        alert('from child_1');
      }, 15000)
    },
    controllerAs: 'vm'
  })
  .state('child2', {
    url: '/child2',
    parent: 'app',
    templateUrl: 'app/child2.html',
    controller: 'ctrl_2',
    controllerAs: 'vm'
  })
$stateProvider
.state('应用程序'{
摘要:没错,
观点:{
“导航”:{
templateUrl:'app/navbar.html',
控制器:“NavbarController”,
controllerAs:'vm'
},
“main@”:{
模板:“”
}
}
})
.州(“儿童1”{
url:“/child1”,
父项:“应用程序”,
templateUrl:'app/child1.html',
控制器:函数($timeout){
$timeout(函数(){
警报(“来自child_1”);
}, 15000)
},
controllerAs:'vm'
})
.州(“儿童2”{
url:“/child2”,
父项:“应用程序”,
templateUrl:'app/child2.html',
控制器:“ctrl_2”,
controllerAs:'vm'
})
当我快速从
/child1
转到
/child2
时(15000毫秒之前),仍然看到
child1
控制器中定义的警报,这是正常行为吗

这是正常的行为吗

是的,这是正常的行为。创建并提供给另一个函数(如
$timeout
服务)的函数引用将持续到另一个函数保留该引用为止。对于
$timeout
服务,它将在超时期间(在本例中为15秒)保留该引用

此外,如果子函数使用父函数的局部变量,则这些局部变量将在子函数的生命周期内保留。这一过程被称为“创建闭包”

有关详细信息,请参阅

需要告知
$timeout
服务取消超时并删除引用,否则它将持续超过控制器的使用寿命

controller: function($timeout, $scope) {
  var promise = $timeout(function() {
    alert('from child_1');
  }, 15000);
  $scope.$on("$destroy", function() {
    promise.cancel();
  });
},
在上面的示例中,
$timeout
服务将一个名为
cancel
的函数附加到它返回的承诺上。客户端代码可以调用该函数,告诉
$timeout
服务中止超时并释放对该函数的引用

ui路由器
child1
状态切换到另一个状态时,它会破坏控制器的作用域。控制器应侦听
$destroy
事件并取消超时

这是正常的行为吗

是的,这是正常的行为。创建并提供给另一个函数(如
$timeout
服务)的函数引用将持续到另一个函数保留该引用为止。对于
$timeout
服务,它将在超时期间(在本例中为15秒)保留该引用

此外,如果子函数使用父函数的局部变量,则这些局部变量将在子函数的生命周期内保留。这一过程被称为“创建闭包”

有关详细信息,请参阅

需要告知
$timeout
服务取消超时并删除引用,否则它将持续超过控制器的使用寿命

controller: function($timeout, $scope) {
  var promise = $timeout(function() {
    alert('from child_1');
  }, 15000);
  $scope.$on("$destroy", function() {
    promise.cancel();
  });
},
在上面的示例中,
$timeout
服务将一个名为
cancel
的函数附加到它返回的承诺上。客户端代码可以调用该函数,告诉
$timeout
服务中止超时并释放对该函数的引用


ui路由器
child1
状态切换到另一个状态时,它会破坏控制器的作用域。控制器应该监听
$destroy
事件并取消超时。

你说的快速是什么意思?@GauravSrivastava我的意思是在5秒之前,这是
child1
控制器中
$timeout
函数的第2个参数。超时肯定会起作用。虽然有角度服务,但这是一个窗口事件。您需要清除作用域destroy Event中的超时,这可能会起作用:-您必须手动取消所有定义的行为:超时/监视/事件等<代码>作用域。$on(“$destroy”,…)就是为此而设计的。你说的快速是什么意思?@GauravSrivastava我的意思是在5秒之前,这是
child1
控制器中
$timeout
函数的第2个参数。超时肯定会起作用。虽然有角度服务,但这是一个窗口事件。您需要清除作用域destroy Event中的超时,这可能会起作用:-您必须手动取消所有定义的行为:超时/监视/事件等<代码>范围。$on(“$destroy”,…)就是为此而设计的。