javascript - 将事件处理程序添加到 AngularJS 包含内容

标签 javascript html angularjs angularjs-directive angularjs-ng-transclude

将事件处理程序添加到嵌入内容的正确方法是什么?我不希望我的指令的使用者将他们自己的点击处理程序添加到文档中。该指令应该处理它。但我不确定如何正确地将处理程序添加到使用 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 属性丢失了。

另外,我见过几个这样的例子......

splinter 的.js

$transclude(function(clone) {
    angular.element(clone).find("button");
});

...但是那些失败了,因为 .find() 没有返回结果,即使检查员似乎认为克隆包含一个“按钮”。

最佳答案

我无法想象您甚至在该指令中进行链接。在你的 fiddle 中,你缺少一些基本要求,例如ng-app="" , restrict: 'E' (1.2.x 要求)在元素样式指令中,以及 transclude: true .通过修复这些,我们得到了一个工作示例。此外,我不确定您要用 $transclude(function(clone) { /*...*/ 做什么,但我怀疑这是不必要的。 观察以下...

<my-foo>
    <button type="button" ng-click="foo()">Foo</button>
</my-foo>

.directive('myFoo', function() {
    return {
        transclude: true,
        restrict: 'E',
        template: '<div class="my-foo" ng-transclude></div>',
        link: function($scope, elem, attrs) {
            $scope.foo = function() {
                console.log('this is called!');
            };
        }
    };
});

JSFiddle Link - 工作演示


根据对话,解决此问题的最直接方法是利用 $compile服务并修改您的 <button> 上的属性(一旦选择)指令中的元素 link .注入(inject) $compile并观察以下...

.directive('myFoo', function($compile) {
    return {
        transclude: true,
        restrict: 'E',
        template: '<div class="my-foo" ng-transclude></div>',
        link: function($scope, elem, attrs) {

            $scope.foo = function() {
                console.log('called')
            }

            var button = elem.find('button');
            button.attr('ng-click', 'foo()');
            $compile(button)($scope);
        }
    };
});

JSFiddle Link - $compile演示

关于javascript - 将事件处理程序添加到 AngularJS 包含内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33817370/

相关文章:

javascript - 页脚下的空白

html - 如何使标记完美重叠,使其不会在同一端出现两次?

javascript - 在 Angular JS 中使用服务无法返回范围值

javascript - 带有 ng-repeat 的动态 id

javascript - 使用 DOM - Javascript 生成 HTML 页面

javascript - Rails Paloma Gem - 如何加载页面特定的 javascript?

JavaScript while循环计算

javascript - 是否可以连接到节点。带有 C++ 客户端的 js websocket 服务器

php - 如何从单选按钮获取值并从 mySQL 获取值

javascript - 使用 Angularjs 以编程方式通过名称将表单外部的输入发布到表单