如何从构建的指令中获取 $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(''+action.broadcaster+'','+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>'
};
});
我很难弄清楚这一点。我有一个基于承诺数据的指令构建 html。对于每一行,它都添加了用于 CRUD 操作的按钮。我不知道如何让按钮事件在我的控制器中触发。不管我的控制器是如何设置的,我怎样才能让事件在我的控制器中注册?我目前正在尝试 $emit
,但似乎没有任何反应。
指令生成html:
controls = controls+'<button type="button" data-tooltip-placement="bottom" data-tooltip="'+action.name+'" ng-click="$emit(''+action.broadcaster+'','+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>'
};
});