所以基本上我有一个控制器,它列出了一堆物品。
每个项目都在渲染一个指令。
每个指令都可以进行选择。
我想要实现的是,一旦做出选择,我想在控制器上调用一个方法来传递选择。
到目前为止我所拥有的是......
app.directive('searchFilterLookup', ['SearchFilterService', function (SearchFilterService) {
return {
restrict: 'A',
templateUrl: '/Areas/Library/Content/js/views/search-filter-lookup.html',
replace: true,
scope: {
model: '=',
setCriteria: '&'
},
controller: function($scope) {
$scope.showOptions = false;
$scope.selection = [];
$scope.options = [];
$scope.selectOption = function(option) {
$scope.selection.push(option);
$scope.setCriteria(option);
};
}
};
}]);
该指令的使用方式如下:
<div search-filter-lookup model="customField" criteria="updateCriteria(criteria)"></div>
然后控制器定义了一个函数:
$scope.updateCriteria = function(criteria) {
console.log("Weeeee");
console.log(criteria);
};
该函数被称为罚款。但是我无法将数据传递给它:(
答案 0 :(得分:3)
试试这个:
$scope.setCriteria({criteria: option});
宣布隔离范围&#34;&amp;&#34; property,angular将表达式解析为将根据父作用域计算的函数。
调用此函数时,您可以传递扩展父作用域的locals对象。
认为$scope.setCriteria
与属性中的函数相同是一个常见的错误。如果你记录它,你会发现它只是一个角度解析的表达式函数,它的父范围保存在它的闭包中。
因此,当您运行$scope.setCriteria()
时,实际上是针对父范围计算表达式。
在你的情况下,这个表达式碰巧是一个函数,但它可以是任何表达式。
但是您在父作用域上没有criteria
属性,这就是为什么angular允许您传递locals对象以扩展父作用域。例如{criteria: option}
您在评论中写道,它要求指令了解控制器中定义的参数名称。不,它没有,只是使用criteria
选项扩展父作用域,你仍然可以使用你想要的任何表达,尽管你可以使用额外的属性。
一个很好的例子是ngEvents
,取ng-click="doSomething($event)"
:
ngClick
为您提供了当地财产$event
,您不必使用,但如果需要,可以使用。
该指令对控制器一无所知,由您来决定您所写的表达方式,欢呼。
答案 1 :(得分:1)
您可以使用=
...
scope: {
model: '=',
setCriteria: '='
},
controller: function($scope) {
// ...
$scope.selectOption = function(option) {
$scope.selection.push(option);
$scope.setCriteria(option);
};
}
<div search-filter-lookup model="customField" criteria="updateCriteria"></div>