你的 ng-click="showMoreInfo()" 没有被触发,因为 ng-click 指令没有被编译(角度完全不知道它)所以点击行为永远不会被触发。
如果您对带有角度指令的动态内容很感兴趣,您想阅读$compile service。
Here's a plunkr 演示 $compile 以及为什么您的代码无法正常工作。
这是来自演示 plunk 的脚本。 “win”指令正确处理对 DOM 的更改,而“fail”指令不能。
app = angular.module("app", [])
.controller("myController",function($scope) {
$scope.showMoreInfo = function() {
alert("Win Moar!");
}
})
.directive("win", ['$compile', function($compile) {
return {
restrict: "E",
scope: {
appendToId: "@",
},
template: "<button ng-click='click()'>ng-click's Inserted From Here Wins!</button>",
link: function(scope, elem, attrs) {
scope.click = function() {
let target = angular.element(document.querySelector("#" + scope.appendToId)),
content = target.html()
;
content += ("<p><span ng-click='showMoreInfo()' class='show-more-info'>...more</span></p>");
target.html(content);
/**
* The $compile service compiles an HTML string or DOM into a
* template and produces a template function,
* which can then be used to link scope and the template together.
*
* Because the html of target is compiled it's directives are going
* to get compiled, namely ng-click='showMoreInfo()'
*
* Note the passing target.scope() instead of scope...
*/
$compile(target)(target.scope());
}
}
}
}]).directive("fail", function() {
return {
restrict: "E",
scope: {
appendToId: "@",
},
template: "<button ng-click='click()'>ng-click's Inserted From Here Fail :(</button>",
link: function(scope, elem, attrs) {
scope.click = function() {
let target = angular.element(document.querySelector("#" + scope.appendToId)),
content = target.html()
;
content += ("<p><span ng-click='showMoreInfo()' class='show-more-info'>...more</span></p>");
/**
* Changing the DOM doesn't cause angular to process changes
* e.g. compile directives like ng-click so the ng-click in
* the content doesn't work.
*/
target.html(content);
}
}
}
})
顺便说一句,通常认为bad practice 从控制器执行 DOM 操作。