ng-包括后退按钮后不工作

时间:2014-07-02 15:02:29

标签: angularjs

我有一个页面,其中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. 更新1:如果我刷新,那么一切都会再次运作。

  2. 更新2:我调试了角度代码,并且在后退按钮之后根本没有调用ngIncludeFillContentDirective。

  3. 更新3:所以,我有一个想法,看看接收更新的范围是否与后退按钮后附加到视图的范围相同,而不是。我创建了一个&#34; myid&#34;范围属性,当用户导航回页面时,视图中显示的范围与订阅&#34; MainContentChangeRequested&#34;的范围不同。事件。 $ scope。$ parent。$$ destroy也设置为true。所以,我有一个范围的引用,其父级已被销毁。看起来这可能是自定义&#34;订阅&#34;的问题。函数,留下对已被破坏的范围的引用我猜是通过angular。

1 个答案:

答案 0 :(得分:1)

是的,终于明白了。这是内存泄漏的经典例子。我们有一个通知服务,可以从控制器发送消息到控制器,或从服务发送到服务,而不依赖于angular的$ scope $ emit / $ broadcast / $ on。它运行得很好,但在这种情况下,由于我们离开了页面,并且我们将订阅者附加到$ scope,我们进入了angular已经“破坏”范围的情况,但是因为我们通过订阅者引用了$ scope,它仍然在内存中,我们得到内存泄漏。这是因为,与angular不同,此服务没有在导航发生时删除消息订阅的机制。提示类似的事情发生在$ scope的$ parent上的一个$$ desrtoyed标志。