Javascript 初始化新控制器时调用的作用域$destroy事件

Javascript 初始化新控制器时调用的作用域$destroy事件,javascript,angularjs,angularjs-scope,Javascript,Angularjs,Angularjs Scope,我目前正在使用Angular JS进行一个项目,我需要能够初始化和销毁控制器和作用域,以便能够在同一模式中显示不同的内容。我遇到的问题是,当我编译新的控制器时,$destroy事件会立即触发,因此范围内的所有观察者都会被销毁 控制器1 app.controller('MainCtrl', function($scope, $compile) { $scope.model = { name: 'World' }; $scope.name = "Felipe"; var DO

我目前正在使用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);
});
html


我以极小的方式再现了这个错误,当在插入的控制器的作用域上调用$destroy时,结果中会显示文本“Scope was destroy”


感谢您为解决此问题提供的任何帮助/解决方法,或指导我如何从一开始就着手解决此问题。

这并没有破坏控制器。您正在监视
$destroy
,因此当作用域上的
$destroy
属性作为控制器实例化的一部分初始化时,它将触发监视。监听销毁事件的正确方法是在上使用
$

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

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

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

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

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

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

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

太棒了,我知道是这样的,谢谢:)@Oreflow不客气。。我想说的另一点是,您不想在控制器中进行任何DOM操作。控制器主要用于管理viewmodel,以呈现您的视图以及可能的任何业务逻辑。。。一般来说,如果您正确使用angular,您不必自己进行太多DOM操作,但在某些情况下,您肯定需要在应该使用指令的地方进行操作。太棒了,我知道是这样的,谢谢:)@Oreflow欢迎您。。我想说的另一点是,您不想在控制器中进行任何DOM操作。控制器主要用于管理viewmodel,以呈现您的视图以及可能的任何业务逻辑。。。一般来说,如果您正确使用angular,您不必自己进行太多DOM操作,但在某些情况下,您肯定需要在应该使用指令的地方进行操作。太棒了,我知道是这样的,谢谢:)@Oreflow欢迎您。。我想说的另一点是,您不想在控制器中进行任何DOM操作。控制器主要用于管理viewmodel,以呈现您的视图以及可能的任何业务逻辑。。。一般来说,如果您正确使用angular,您不必自己进行太多DOM操作,但在某些情况下,您肯定需要在应该使用指令的地方进行操作。太棒了,我知道是这样的,谢谢:)@Oreflow欢迎您。。我想说的另一点是,您不想在控制器中进行任何DOM操作。控制器主要用于管理viewmodel,以呈现您的视图以及可能的任何业务逻辑。。。通常,如果您正确使用angular,您不必自己进行太多DOM操作,但在某些情况下,您肯定需要在应该使用指令的地方进行操作。在控制器中操作DOM是一种不好的做法,您所说的“能够在同一模式中显示不同的内容”是什么意思?你的意思是像你点击按钮1,它会显示一些东西,关闭模式,点击按钮2,它会显示其他东西吗?在控制器中操纵DOM是一种不好的做法,你所说的“能够在同一模式中显示不同的内容”是什么意思?你的意思是像你点击按钮1,它会显示一些东西,关闭模式,点击按钮2,它会显示其他东西吗?在控制器中操纵DOM是一种不好的做法,你所说的“能够在同一模式中显示不同的内容”是什么意思?你的意思是像你点击按钮1,它会显示一些东西,关闭模式,点击按钮2,它会显示其他东西吗?在控制器中操纵DOM是一种不好的做法,你所说的“能够在同一模式中显示不同的内容”是什么意思?你的意思是像你点击按钮1,它会显示一些东西,关闭模式,点击按钮2,它会显示其他东西?