将函数传递给角度指令

时间:2014-12-28 11:06:22

标签: javascript angularjs

所以我有我的指示:

<editable comp="comp" key="'quantity'" input-type="'number'" ed-on-change="save()"></editable> 

我的指示功能:

function editable() {
    return {
        restrict: 'E',
        scope: {
            comp: '=comp',
            key: '=key',
            inputType: '=inputType',
            edOnChange: '=edOnChange'
        },
        templateUrl: '/Partials/Editable.html',

这是在ng-repeat中运行,所以会被击中约20次。我在控制器范围的console.log('saved')函数中执行save(),并输出20次。

有没有办法在调用$compile$apply时阻止此函数被触发(因为我猜这是造成它的原因)?

巧妙的是,我没有看到ng-click具有相同的行为,所以我可能会同时查看源代码。

已解决但不理想

所以只需删除()save上的ed-on-change,然后传入保存功能的引用,然后在我想要的时候调用它。

3 个答案:

答案 0 :(得分:0)

我将函数传递给指令的方式如下:

<editable ... ed-on-change="save"></editable>

注意我删除了()

然后,在指令中我将在范围声明中以与您编写的方式相同的方式。

我会在Editable.html

<div .. ng-click="edOnChange()"></div>

答案 1 :(得分:0)

摘要循环将始终调用属性名称中的函数,因为这是设置该属性值的方式。

如果您尝试将函数的名称传递给指令,以便在某些事件发生时调用该指令,那么您应该将其作为该函数的名称,例如ED-平变化=&#34;保存&#34;

在我看来,你在这里所做的并不完全是&#34; Angular&#34;方式,如果您添加更多信息,我可以提供更好的解决方案。

答案 2 :(得分:0)

答案是使用$parse

<editable ed-on-change="save()"></editable>

在指令中:

.directive('editable', ['$parse', function ($parse) {
    return {
        restrict: 'E',
        link: function (scope, element, attrs) {
            var changeCallback = $parse(attrs.edOnChange) || null;
        }
});