Answers:
该指令可以访问在同一元素上定义的任何属性,即使该指令本身不是该元素也是如此。
模板:
<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()
}
};
});
如果attribute的值example-number
将被硬编码,则建议使用$eval
一次并存储该值。变量num
将具有正确的类型(数字)。
您可以使用与element指令完全相同的方式进行操作。您将把它们放在attrs对象中,我的示例通过隔离范围将它们双向绑定,但这不是必需的。如果您使用的是隔离范围,则可以使用scope.$eval(attrs.sample)
scope.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);
}
};
});
{{true}}
但它仍然返回字符串值true
。
如果您从另一个指令“要求”“ 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();
});
scope: false
),新作用域(具有正常的原型继承,即scope: true
)和隔离作用域(即scope: { ... }
)。您的指令创建哪种类型的作用域?