从指令调用控制器函数(从指令传递的params)

时间:2016-03-20 14:41:49

标签: javascript angularjs d3.js angularjs-directive

所以我想要实现的是传递一个函数(它接受2个参数)并在控制器中定义到指令中,并使用带有指令参数的指令从params调用。

.on('click', function(d, i){
    // here I want to call the function from the controller,
    ctrlCB(d, i);
})

我的控制器看起来有点像这样:

(function () {
'use strict';
angular.module('d3')
    .directive('verticalBarChart', verticalBarChart);
    verticalBarChart.$inject = ['d3Service', '$window', '$parse'];
    function verticalBarChart(d3Service, $window, $parse) {
        return {
            restrict: 'EA',
            scope: {
                data: '=',
                click: '=click'
            },
            link: function (scope, element, attrs) {
                d3Service.d3()
                .then(function (d3) {
                    // some more d3.js stuff
                    svg.selectAll('rect')
                        .data(data).enter()
                        .append('rect')
                        .attr('width', barWidth)
                        .on('click', function (d, i) {
                            scope.click(d, i); // THIS IS THE ONE I'M INTERESTED IN !
                            // on click it calls the function, but the params don't get passed in
                        })
                    }
                });
            }
        };
    }

指令:

<div vertical-bar-chart bar-padding="2" data="barData" click="clickCallback"></div>

并且在控制器中我将例如具有

$scope.clickCallback = function(d, i){
    $location.url('/item/'+i)
}

2 个答案:

答案 0 :(得分:2)

我想纠正的第一件事是,当您想要&传递给=时,您应该使用function(表达式绑定)而不是使用scope: { data: '=', click: '&click', //or just kept it like below where `click` alias is redudant //click: '&' }, (双向绑定)指令并从那里调用它。

click

然后在click="clickCallback(d, i)" 属性上调用方法,而不仅仅是在那里引用它。

JSON

要从指令调用方法,请以scope.click({d: d, i: i}); scope.$apply(); 格式&amp ;;传递其参数值。运行摘要周期以更新其绑定,因为我们正在从外部事件修改范围。

s = rand() % 7 + 4;

答案 1 :(得分:0)

更新:Pankaj Parkar有更好的答案,但我会把我的帖子作为一个不好的选择,而不是删除它。

我无法访问您绘制条形图的服务,但我将分享如何与父控制器进行子指令对话,并希望通过简化点击代表您的div栏来回答您的问题结束图。

   $scope.init = function(){

       var onBarClickHandler = function(ev){
           d3.event.stopPropagation();
           $scope.click( $scope.data );
       }

       var bar = d3.select("#bar");
       bar.on("click", onBarClickHandler );
    } 

codepen: angular d3 directive parent controller talk

就个人而言,在编写angular1代码时,我喜欢将逻辑移入控制器而不是将其放在链接指令中,但是如果你喜欢在链接中使用它,这也应该有效。