请参阅示例here
foodMeApp.directive('fmRating', function() {
return {
restrict: 'E',
scope: {
symbol: '@',
max: '@',
readonly: '@'
},
require: 'ngModel',
link: function(scope, element, attrs, ngModel) {
attrs.max = scope.max = parseInt(scope.max || 5, 10);
...
要在隔离的范围对象中定义Angular需要symbol
,max
,readonly
以从父范围访问它。
使用here
<fm-rating ng-model="$parent.restaurant.price" symbol="$" readonly="true"></fm-rating>
那么,attrs
的目的是什么?无法访问通过attrs
传递的所有属性。为什么不能将访问值设置为attrs.max
而不是scope.max
为什么要回拨attrs.max = scope.max
?
由于这个应用程序是由Angular作者编写的,我希望有一个理由。
感谢。
答案 0 :(得分:94)
attrs的目的是什么?
在与指令相同的元素上定义的属性有以下几个目的:
无法访问通过attrs传递的所有属性吗?
是的,你可以,但
{{}}
s的属性值会导致问题,因为它们不会被插值。
<my-directive name="My name is {{name}}">
且父范围有$scope.name='Mark'
。然后,在链接功能中,console.log(attrs.name)
会生成undefined
。
attrs.$observe('name', function(val) { console.log(val) })
会生成My name is Mark
。 (注意,在链接函数内部,必须使用$ observe()来获取插值。)为什么不能将max的值访问为attrs.max而不是scope.max
上面回答
为什么要像attrs.max = scope.max那样分配回来?
我能想到这样做的唯一原因是,某些其他指令需要查看此属性/值(即,指令间通信)。但是,另一个指令需要在此指令之后运行才能生效(可以使用priority
指令设置稍微控制一下)。
摘要:在具有隔离范围的指令中,通常您不想使用attrs
。 (我想这可能是一种将初始化数据/值发送到指令中的方法 - 即,如果您不需要对这些值进行数据绑定而不需要插值。)
答案 1 :(得分:3)
使用attrs,您可以访问html标记中定义的属性,如
<fm-rating ng-model="$parent.restaurant.price" symbol="$" readonly="true">
因此,在这种情况下,您可以访问符号和 readonly 属性。您在自定义指令中定义的每个属性都可用于 attrs 变量。
块:
attrs.max = scope.max = parseInt(scope.max || 5, 10);
将解析并指定当前 scope.max 值或 5 (如果不存在),发布到scope.max和attrs.max 。这样,在分配后,您可以从attrs.max 中读取。在此之前,未定义的attrs.max属性。
检查fmRating.js源我不知道为什么/何时/何时使用这段代码。