我们在应用程序中有嵌套指令。 我们将控制器的scope.openFundReport传递给内部指令。
<div ng-controller="app">
<sa-grid src="accounts">
<my-directive data="row.funds" onclick="parentScope.openFundReport(f)" />
</sa-grid>
指令js
angular.module("app").directive("myDirective",function(){
return{
restrict:"E",
scope:{
data:"=",
onclick="&"
},
controller : function($scope){
$scope.openReport=function(f){
$scope.onclick({f:f});
}
},
templateUrl="t.html"
}
}
});
指令html
<div>
<ul>
<li ng-repeat="f in funds">
<a ng-click="openReport(f)">{{f.symbol}}</a>
</li>
</ul>
</div>
点击链接后,控制器的openFundReport函数会被正确调用。 但错误是在浏览器中记录, 未捕获的ReferenceError:未定义parentScope(索引):1 的onclick
JS Fiddler示例http://jsfiddle.net/9X3V4/2/
答案 0 :(得分:1)
问题应该是显而易见的,但是方式花了太长时间才能看到它。您通过openFR
属性传递了onclick
,该属性有效。但onclick
也是标准的javascript事件。在Angular完成它之后,javascript处理事件,当然它找不到openFR
。解决方案是将您的属性命名为其他内容,例如点击&#39;或点击事件&#39;。
答案 1 :(得分:-1)
如果你想执行一个函数onclick你需要使用=而不是&amp;然后在你的指令触发的指定事件上调用该函数,比如
angular.module("app").directive("myDirective",function(){
return{
restrict:"E",
scope:{
data:"=",
onclick="="
},
controller : function($scope){
$scope.openReport=function(f){}
},
templateUrl="t.html"
}
}
});
我从未尝试过这个,但它应该通过使用=你绑定到父范围函数。如果这不能解决问题,你可能想在指令中创建一个ngClick处理程序,然后从处理程序中调用传递的函数
注意:这是我自己测试的指令
directive('dir3', [ function() {
return {
restrict:'C',
template:'<button ng-click="click()"></button>',
scope:{
click:'='
},
link: function(scope, element, attrs){
}
}}]);
用法
<div click="click" class="dir3">click</div>
控制器部分
$scope.click=function(){
alert('hola');
}