次のように制限された属性ディレクティブがあります。
restrict: "A"
2つの属性を渡す必要があります。 attrs
オブジェクトを使用して、ディレクティブ内で数値と関数/コールバックにアクセスします。
ディレクティブが要素ディレクティブであり、"E"
で制限されている場合、次のようにできます。
<example-directive example-number="99" example-function="exampleCallback()">
ただし、理由がわからないため、ディレクティブを属性ディレクティブにする必要があります。
複数の属性を属性ディレクティブに渡すにはどうすればよいですか?
ディレクティブは、ディレクティブ自体が要素ではない場合でも、同じ要素で定義されているすべての属性にアクセスできます。
テンプレート:
<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()
}
};
});
属性example-number
の値がハードコーディングされる場合は、 $eval
を1回使用して値を保存することをお勧めします。変数num
は正しいタイプ(数値)になります。
要素ディレクティブを使用する場合とまったく同じ方法で実行します。それらをattrsオブジェクトに入れます。私のサンプルでは、isolateスコープを介した双方向バインディングがありますが、これは必須ではありません。分離スコープを使用している場合は、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>
オブジェクトを属性として渡し、次のようにディレクティブに読み込むことができます。
<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);
}
};
});
これは私のために働いたと私はよりHTML5に準拠していると思います。 「data-」プレフィックスを使用するようにHTMLを変更する必要があります
<div data-example-directive data-number="99"></div>
そして、ディレクティブ内で変数の値を読み取ります。
scope: {
number : "=",
....
},
別のディレクティブから「exampleDirective」を「必要」とする場合、ロジックは「exampleDirective」のコントローラーにあります(「exampleCtrl」としましょう):
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();
});