将事件处理程序添加到嵌入内容的正确方法是什么?我不希望我的指令的使用者将他们自己的点击处理程序添加到文档中。该指令应该处理它。但是我不确定如何正确地将处理程序添加到使用 ng-transclude 传递的内容中。
摆弄:https : //jsfiddle.net/hoe71p0e/12/(无法让 Angular.js 和 JSFiddle 工作;我的链接函数没有被调用)
foo.html
<my-foo>
<button type="button">Foo</button>
</my-foo>
foo.js
return {
template: "<div class='my-foo' data-ng-transclude></div>"
link: function($scope, $elem, $attrs, $ctrl, $transclude) {
$scope.foo = function() {
console.log("this is never called");
};
$transclude(function(clone) {
for (var i in clone) {
if (clone[i].localName === "button") {
angular.element(clone[i]).attr("data-ng-click", "foo()");
}
}
});
}
};
预期结果(点击按钮应该调用 foo)
<div class="my-foo">
<button type="button" data-ng-click="foo()">Foo</button>
</div>
实际结果(点击按钮什么都不做)
<div class="my-foo">
<button type="button">Foo</button>
</div>
请注意,data-ng-click
按钮上的属性丢失了。
另外,我见过几个这样的例子......
破碎的.js
$transclude(function(clone) {
angular.element(clone).find("button");
});
...但是那些失败是因为.find()
没有返回结果,即使检查员似乎认为克隆包含一个“按钮”。