答案 0 :(得分:2)
在这种情况下,您应该通过=
绑定传递函数引用,否则您将无法使用指令内部的参数运行外部函数。所以改变你的代码,比如:
app.directive("subTitle", function () {
return {
replace:true,
scope:{
change :'=',
item : '=',
index:'='
},
template : '<h2>{{item.name}} {{index}}</h2>',
link : function (scope, element, attrs) {
var num = scope.index;
element.on('click', function () {
scope.change(num, scope.item);
scope.$apply();
})
}
}
})
请记住,如果你正在运行这样的函数(由DOM事件触发,而不是由Angular触发),框架就不知道你刚刚运行它的事实。因此,您必须在最后触发Angular的摘要循环,因此scope.$apply();
(我还修复了对item
的敬意,因为它已在scope
对象上声明,因此scope.change(num, scope.item)
代替scope.change(num, item
) < / p>
然后在你的模板中声明如下:
<sub-title item='item' index=$index ng-repeat="item in items" change="changeItem"></sub-title>
答案 1 :(得分:1)
您可以使用$ rootScope。$ broadcast来调用控制器的功能
var app = angular.module('myApp', []);
app.controller('main', ["$scope", function($scope) {
console.log("cotroller")
$scope.items = [{"name":'one'},{"name":'two'},{"name":'three'}, {"name":'four'},{"name":'five'},{name:'six'}];
$scope.activeItem = $scope.items[0];
$scope.queueItems = $scope.items.splice(0,1);
$scope.changeItem = function (index, item) {
console.log("change now", index, item.name); //not consoling
}
$scope.change=function(){
//your logic
}
$rootScope.$broadcast('msgFromDirective',function(evnt,data){
$scope.change(data.Num,data.Item);
});
}]);
指令
app.directive(&#34; subTitle&#34;,function($ rootScope){
return {
replace:true,
scope:{
change :'&',
item : '=',
index:'='
},
template : '<h2>{{item.name}} {{index}}</h2>',
link : function (scope, element, attrs) {
var num = scope.index;
element.on('click', function () {
$rootScope.$broadcast('msgFromDirective',{Num:num,Item:item});
// scope.change(num, item);
})
}
}
})
答案 2 :(得分:1)
在没有paranthesis的html传递函数引用中。
<sub-title item='item' index=$index ng-repeat="item in items" change="changeItem"></sub-title>
因为我们传递了函数引用,scope.change()
不会调用函数,而是返回changeItem
函数。
scope.change();
以上电话将返回:
function (index, item) {
console.log("change now", index, item.name); //not consoling
}
所以你必须先调用检索函数,而不是调用实际的函数。
scope.change()(scope.num, scope.item); // calls changeItem function
选中 PLUNKER ,我已编辑了您的代码。