我注意到对我来说似乎是一个错误,但可能更多的是我滥用$compile
AngularJS 中的服务:我有一个名为“动态”的指令,它编译 angularjs 代码并将其显示到一个 div 中。我在这种情况下编译的代码包含ng-controllers
并且那些控制器正在监听事件。问题是显然控制器在被替换后并没有“死”,因为应该消失的控制器仍然会对事件(如$routeChangeSuccess
或任何其他事件)做出反应。这是一个显示问题的工作plunkr 。让我们看看我的问题的示例代码:
我正在使用的指令:
app.directive('dynamic', function ($compile) {
return {
restrict: 'A',
replace: true,
link: function (scope, element, attrs) {
scope.$watch(attrs.dynamic, function(html) {
element.html(html);
$compile(element.contents())(scope);
});
}
};
});
主控制器,其次是我包括的控制器:
app.controller('TestCtrl', function($scope) {
$scope.dynamicContent = "Default content";
$scope.firstButton = function() {
$scope.dynamicContent = "<div ng-controller='FirstCtrl'>The div from first button</div>";
}
$scope.secondButton = function() {
$scope.dynamicContent = "<div ng-controller='SecondCtrl'>The div from second button</div>";
}
$scope.checkButton = function() {
$scope.$broadcast('checkEvent');
}
});
app.controller('FirstCtrl', function($scope) {
$scope.$on('checkEvent', function() {
alert(1);
});
});
app.controller('SecondCtrl', function($scope) {
$scope.$on('checkEvent', function() {
alert(2);
});
});
现在,如果我打电话firstButton()
then secondButton()
then checkButton()
,而不是只alert(2)
收到 ,我会收到两个警报。如果我点击按钮 1/2/1/2/1/2/1/2,它将向我显示与我点击的按钮一样多的警报。
我在这里做错了什么?
谢谢,希尔纽斯