如何将多个属性传递给Angular.js属性指令?

时间:2013-05-14 15:08:07

标签: javascript parameters angularjs attributes directive

我的属性指令限制如下:

 restrict: "A"

我需要传递两个属性;数字和函数/回调,使用attrs对象在指令中访问它们。

如果指令是一个元素指令,用"E"限制,我可以这样做:

<example-directive example-number="99" example-function="exampleCallback()">

但是,由于我不会进入的原因,我需要将指令作为属性指令。

如何将多个属性传递给属性指令?

5 个答案:

答案 0 :(得分:200)

该指令可以访问在同一元素上定义的任何属性,即使该指令本身不是该元素。

模板:

<div example-directive example-number="99" example-function="exampleCallback()"></div>

指令:

app.directive('exampleDirective ', function () {
    return {
        restrict: 'A',   // 'A' is the default, so you could remove this line
        scope: {
            callback : '&exampleFunction',
        },
        link: function (scope, element, attrs) {
            var num = scope.$eval(attrs.exampleNumber);
            console.log('number=',num);
            scope.callback();  // calls exampleCallback()
        }
    };
});

fiddle

如果属性example-number的值将被硬编码,我建议使用$eval一次,并存储该值。变量num将具有正确的类型(数字)。

答案 1 :(得分:19)

您可以使用与element指令完全相同的方式执行此操作。你将把它们放在attrs对象中,我的样本通过隔离范围让它们进行双向绑定,但这不是必需的。如果您使用的是隔离范围,则可以使用scope.$eval(attrs.sample)或仅使用scope.sample访问属性,但根据您的具体情况,可能无法在链接中定义这些属性。

app.directive('sample', function () {
    return {
        restrict: 'A',
        scope: {
            'sample' : '=',
            'another' : '='
        },
        link: function (scope, element, attrs) {
            console.log(attrs);
            scope.$watch('sample', function (newVal) {
                console.log('sample', newVal);
            });
            scope.$watch('another', function (newVal) {
                console.log('another', newVal);
            });
        }
    };
});

用作:

<input type="text" ng-model="name" placeholder="Enter a name here">
<input type="text" ng-model="something" placeholder="Enter something here">
<div sample="name" another="something"></div>

答案 2 :(得分:8)

您可以将对象作为属性传递,并将其读入指令,如下所示:

<div my-directive="{id:123,name:'teo',salary:1000,color:red}"></div>

app.directive('myDirective', function () {
    return {            
        link: function (scope, element, attrs) {
           //convert the attributes to object and get its properties
           var attributes = scope.$eval(attrs.myDirective);       
           console.log('id:'+attributes.id);
           console.log('id:'+attributes.name);
        }
    };
});

答案 3 :(得分:4)

这对我有用,我认为更符合HTML5。您应该将html更改为使用'data-'前缀

<div data-example-directive data-number="99"></div>

在指令中读取变量的值:

scope: {
        number : "=",
        ....
    },

答案 4 :(得分:0)

如果你需要&#34; &#39; exampleDirective&#39;从另一个指令+你的逻辑是在例如指导的&#39;控制器(让我们说&#39; exampleCtrl&#39;):

app.directive('exampleDirective', function () {
    return {
        restrict: 'A',
        scope: false,
        bindToController: {
            myCallback: '&exampleFunction'
        },
        controller: 'exampleCtrl',
        controllerAs: 'vm'
    };
});
app.controller('exampleCtrl', function () {
    var vm = this;
    vm.myCallback();
});