在Directive上调用方法将数据传递给Controller

时间:2014-06-12 06:06:08

标签: angularjs angularjs-directive

所以基本上我有一个控制器,它列出了一堆物品。

每个项目都在渲染一个指令。

每个指令都可以进行选择。

我想要实现的是,一旦做出选择,我想在控制器上调用一个方法来传递选择。

到目前为止我所拥有的是......

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);
};

该函数被称为罚款。但是我无法将数据传递给它:(

2 个答案:

答案 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>