我有一个页面,其中ng-include指令声明为此
<div name="mainContent" data-ng-include="mainContentTemplateUrl">
</div>
在页面的控制器中,我订阅&#34; MainContentChangeRequested&#34;从操作菜单中引发的事件。然后,Handler计算出要加载的模板,并像这样更改mainContentTemplateUrl的值
function inDefaultCtrl($scope, $routeParams, $location, $timeout, insuredProfileSvc) {
$scope.title = controllerId;
$scope.myid = generateQuickGuid();
$scope.subscribe('InsuredUpdated', controllerId, function (insured) { $scope.insured = insured; });
activate();
function activate() {
$scope.subscribe("MainContentChangeRequested", controllerId, function (payload) { loadMainContent(payload.routeName); });
$scope.$on("$routeUpdate", function (event) {
console.log("routeUpdate");
});
load();
}
function loadMainContent(routeName) {
$scope.mainContentTemplateUrl = $scope.getTemplateUrl(routeName);
$location.search('view', routeName).replace();
}
function generateQuickGuid() {
return Math.random().toString(36).substring(2, 15) +
Math.random().toString(36).substring(2, 15);
}
} 这一切都很好,我能够交换没有isues的视图,但是,如果我单击后退按钮,然后再次返回页面,没有任何作用,我无法再交换视图。我调试了代码,并且所有代码都被执行,maintContentTemplateUrl被更改,但看起来ng-include没有做任何事情。有什么想法吗?
更新1:如果我刷新,那么一切都会再次运作。
更新2:我调试了角度代码,并且在后退按钮之后根本没有调用ngIncludeFillContentDirective。
答案 0 :(得分:1)
是的,终于明白了。这是内存泄漏的经典例子。我们有一个通知服务,可以从控制器发送消息到控制器,或从服务发送到服务,而不依赖于angular的$ scope $ emit / $ broadcast / $ on。它运行得很好,但在这种情况下,由于我们离开了页面,并且我们将订阅者附加到$ scope,我们进入了angular已经“破坏”范围的情况,但是因为我们通过订阅者引用了$ scope,它仍然在内存中,我们得到内存泄漏。这是因为,与angular不同,此服务没有在导航发生时删除消息订阅的机制。提示类似的事情发生在$ scope的$ parent上的一个$$ desrtoyed标志。