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

时间:2015-08-12 15:54:42

标签: angularjs javascript-events

我很难搞清楚这一点。我有一个指令从promise数据构建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没有注册;

2 个答案:

答案 0 :(得分:0)

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

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

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

在secon链接中,您可以将$ emit和$ broadcast放在同一个控制器中,看看你是否抓住了你的$ on

答案 1 :(得分:0)

虽然您可以在角度中使用事件来实现,但另一个选择是使用&表达式范围绑定将控制器方法传递给指令。示例代码(来自egghead.io)(请参阅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>'
        };
    });