私にとってバグのように見えるものに気付きましたが、おそらく$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()
次にを呼び出すとsecondButton()
、checkButton()
のみを受信するのではなく、alert(2)
2 つのアラートを受信します。ボタン 1/2/1/2/1/2/1/2 を押すと、クリックしたボタンと同じ数のアラートが表示されます。
ここで何が間違っていますか?
ありがとう、ヒルニウス