如何从指令中调用控制器函数

Posted

技术标签:

【中文标题】如何从指令中调用控制器函数【英文标题】:How to call controller function from directives 【发布时间】:2015-12-08 03:48:03 【问题描述】:

我正在使用 Angularjs,我想从指令中调用控制器函数,但它不起作用,请帮忙。

在我的代码下面

app.directive('datetimez', function () 
    return 
        restrict: 'A',
        require: 'ngModel',
        link: function (scope, element, attrs, ngModelCtrl) 
            element.datetimepicker(
                dateFormat: 'dd-mm-yyyy'
            ).on('changeDate', function (e) 
                changedate();
                //ngModelCtrl.$setViewValue(e.date);
                //scope.$apply();
            );
        
    ;
);

控制器:

app.controller('GetIncidentcnt', function ($scope) 

    $scope.changedate = function () 
        alert('Hi#####fromdate');
    
);

html

<div id="date" class="input-append" datetimez ng-model="var1">
    <input data-format="dd-MM-yyyy" type="text" id="input1" data-date-start-date="+0d" name="input1"></input>
    <span class="add-on">
        <i data-time-icon="icon-time" data-date-icon="icon-calendar"></i>
    </span>
</div>

我想从指令函数调用changedate()

【问题讨论】:

【参考方案1】:

由于您可能需要在页面上多次使用它,在这种情况下,当您想在每个 datepicker 上调用不同的方法时,从指令调用控制器方法会变得一团糟。

所以我建议你在那里使用独立的scope 来制作一个可重用的组件。 为此,您需要添加 scope: onChange: '&amp;' ,,通过在将提供控制器方法协定的指令元素上添加 on-change 属性,使用 &amp;(指示要执行的表达式)的指令可用于指令。

标记

<div id="date" class="input-append" datetimez ng-model="var1" on-change="changedate()">

指令

   app.directive('datetimez', function () 
        return 
            restrict: 'A',
            scope: 
               onChange: '&'
            ,
            require: 'ngModel',
            link: function (scope, element, attrs, ngModelCtrl) 
                element.datetimepicker(
                    dateFormat: 'dd-mm-yyyy'
                ).on('changeDate', function (e) 
                    //to run digest cycle to..
                    scope.$apply(function()
                       scope.onChange();
                    )

                );
            
        ;
    );

【讨论】:

标记示例中仍然有on-click;应该是on-change @JackA。谢谢队友..我忘记了要更改的属性【参考方案2】:

如果指令在控制器的范围内(在模板中)声明,您只需引用指令继承的 scope 对象上的方法,作为 link 方法的参数给出:

link: function (scope, element, attrs, ngModelCtrl) 
    element.datetimepicker(
        dateFormat: 'dd-mm-yyyy'
    ).on('changeDate', function (e) 
        scope.changedate();
//      ^^^^^
    );

【讨论】:

调用控制器方法后..你需要手动运行digest循环才能看到效果..

以上是关于如何从指令中调用控制器函数的主要内容,如果未能解决你的问题,请参考以下文章

使用隔离范围时,从指令调用控制器的功能?

在 AngularJS 中从没有隔离范围的指令调用控制器函数

如何在运行控制器代码后调用链接指令功能

在 TypeScript Angular 指令中调用函数?

从其他控制器调用指令控制器中的方法

AngularJS:如何将参数/函数传递给指令?