我目前正在使用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被销毁”的文本。
感谢您解决此问题的任何帮助/解决方法,或者从一开始就应该如何解决这个问题的指导原则。
答案 0 :(得分:3)
它不会破坏控制器。您正在查看$destroy
,因此当作用域的$destroy
属性初始化为控制器实例化的一部分时,它会触发监视。侦听destroy事件的正确方法是使用$on
。
$scope.$on('$destroy', function() {
$('#errorMessage').html('Scope was destroyed');
console.log('destroyed scope', arguments);
});