范围$ destroy初始化新控制器时调用的事件

时间:2014-08-14 12:58:54

标签: javascript angularjs angularjs-scope

我目前正在使用Angular JS开发一个项目,我需要能够初始化和销毁​​控制器和范围,以便能够在同一模态中显示不同的内容。我遇到的问题是,当我编译新的控制器时,$ destroy事件会立即触发,因此范围内的所有观察者都会被销毁。

控制器1

app.controller('MainCtrl', function($scope, $compile) {
    $scope.model = { name: 'World' };
    $scope.name = "Felipe";
    var DOM = '<div ng-controller="Ctrl2">{{model}}<input type="text" ng-model="model.name"/></div>';
    var newScope = $scope.$new();
    var elem = $compile(DOM)(newScope);
    $('#test1').append(elem);
});

正在插入的控制器2

app.controller('Ctrl2', function($scope) {
    $scope.model = { name: 'World2' };
    $scope.name = "Felipe2";
    $scope.$watch('$destroy', function() {
        $('#errorMessage').html('Scope was destroyed');
        console.log('destroyed scope');
    });
});

HTML

<body ng-controller="MainCtrl">
    <div id="test1"></div>
    <div id="errorMessage"></div>
</body>

我在最小plunker中重现了错误,当插入控制器的范围内调用了$ destroy时,结果中显示了“Scope被销毁”的文本。

感谢您解决此问题的任何帮助/解决方法,或者从一开始就应该如何解决这个问题的指导原则。

1 个答案:

答案 0 :(得分:3)

它不会破坏控制器。您正在查看$destroy,因此当作用域的$destroy属性初始化为控制器实例化的一部分时,它会触发监视。侦听destroy事件的正确方法是使用$on

   $scope.$on('$destroy', function() {
    $('#errorMessage').html('Scope was destroyed');
    console.log('destroyed scope', arguments);
   });