因为NG单击指令不被编译你的NG-点击= “showMoreInfo()” 不点火(角度是完全不知道它),所以点击行为永远不会被触发。
如果您要使用角度指令强调动态内容,您想要阅读$compile service。
Here's a plunkr演示$ compile和为什么你的代码不工作。
下面是演示程序的脚本。 “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操作。
这不是关于修剪任何东西。我有一个JSON文件,其中一个键包含一个非常长的字符串。所以我想要采取它的一部分(子字符串),并添加一个可扩展文本的可点击跨度。我不能在模板中执行此操作,它必须从控制器动态执行,但绑定不起作用 – Shepherd