2016-11-07 73 views
0

我M的定义使用的UI路由器我的应用程序状态:控制器生命周期角度

$stateProvider 
    .state('app', { 
    abstract: true, 
    views: { 
     '[email protected]': { 
     templateUrl: 'app/navbar.html', 
     controller: 'NavbarController', 
     controllerAs: 'vm' 
     }, 
     '[email protected]': { 
     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' 
    }) 

当我去从/child1/child2快速(前15000毫秒),我仍然看到了警报在child1控制器中定义,这是一个正常的行为?

+0

你是什么意思? –

+0

@GauravSrivastava我的意思是在5秒之前,这是'child1'控制器中'$ timeout'函数的第2个参数。 – Mahmoud

+0

超时一定会奏效。虽然角度服务在那里,但它是一个窗口事件。你需要清除超时范围销毁事件 – murli2308

回答

2

这是正常行为吗?

是的,这是正常的行为。创建并赋予另一个函数(例如$timeout服务)的函数引用将一直持续,只要其他函数保留该引用即可。对于$timeout服务,它将在超时期间(在本例中为15秒)内保留该参考。

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

欲了解更多信息,请参阅MDN JavaScript Reference - Closures

需要被告知取消暂停和删除引用的$timeout服务或将持续超过控制器的使用寿命。

controller: function($timeout, $scope) { 
    var promise = $timeout(function() { 
    alert('from child_1'); 
    }, 15000); 
    $scope.$on("$destroy", function() { 
    promise.cancel(); 
    }); 
}, 

在上面的例子中,服务$timeout附加被叫cancel到它返回承诺函数。客户端代码可以调用该函数来通知$timeout服务中止超时并释放对函数的引用。

ui-routerchild1状态切换到另一个状态时,它破坏了控制器的范围。控制器应该监听$destroy事件并取消超时。