如何从构建的指令中获取 $emit 到控制器 html

How do I get $emit to controller from directive built html

我很难弄清楚这一点。我有一个基于承诺数据的指令构建 html。对于每一行,它都添加了用于 CRUD 操作的按钮。我不知道如何让按钮事件在我的控制器中触发。不管我的控制器是如何设置的,我怎样才能让事件在我的控制器中注册?我目前正在尝试 $emit,但似乎没有任何反应。

指令生成html:

controls = controls+'<button type="button" data-tooltip-placement="bottom" data-tooltip="'+action.name+'" ng-click="$emit(&apos;'+action.broadcaster+'&apos;,'+rowId+')" name="'+action.name+'" class="btn btn-xs btn-default ng-scope"><i class="'+action.icon+'"></i> </button>'

它在 Chrome 工具中的外观:

<button type="button" data-tooltip-placement="bottom" data-tooltip="delete" ng-click="$emit('removeOrgCourse',134)" name="delete" class="btn btn-xs btn-default ng-scope"><i class="fa fa-trash-o"></i> </button>

和我的控制器侦听器:

$scope.$on('removeOrgCourse', function( event, data ){
     console.log(data);
});

更新:
只是将 ng-click 更改为 console.log("click") 并没有任何反应。所以问题是 ng-click 没有注册;

也许你必须使用 $broadcast,取决于控制器是否在同一级别或谁在谁之上。

Working with $scope.$emit and $scope.$on

http://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/

在第二个 link 中,你可以将 $emit 和 $broadcast 放在同一个控制器中,看看你在 $on

中发现了什么

虽然您可以使用 angular 中的事件来实现这一点,但另一种选择是使用 & 表达式范围绑定将控制器方法传递给指令。示例代码(来自egghead.io)(see working code at jsbin):

<div ng-app="phoneApp">
<!-- we've replaced the use of $scope with the preferred "controller as" syntax. see:http://toddmotto.com/digging-into-angulars-controller-as-syntax/ -->
<div ng-controller="AppCtrl as appctrl">
    <div phone dial="appctrl.callHome(message)"></div>
    <div phone dial="appctrl.callHome(message)"></div>
    <div phone dial="appctrl.callHome(message)"></div>
</div>

控制器:

    app.controller("AppCtrl", function() {
        var appctrl = this;
        appctrl.callHome = function(message) {
            alert(message);
        };
    });

和指令:

 app.directive("phone", function() {
        return {
            scope: {
                dial: "&"
            },
            template: '<input type="text" ng-model="value">' +
              '<div class="button" ng-click="dial({message:value})">Call home!</div>'
        };
    });