2013-01-13 49 views
46

请参阅例如hereAngularjs指令:隔离范围和ATTRS

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); 
... 

角需要symbolmaxreadonly在分离的范围对象从父范围访问它来限定。

它是用来here

<fm-rating ng-model="$parent.restaurant.price" symbol="$" readonly="true"></fm-rating>

那么,什么是attrs的目的是什么?无法访问通过attrs传递的所有属性。为什么不能访问max的最大值为attrs.max而不是scope.max

为什么要返回像attrs.max = scope.max

由于这个应用程序是由Angular作者编写的,我期待一个理由。

谢谢。

+1

请查看此处http:///stackoverflow.com/questions/14050195/what-is-the-difference-between-and-in-directive-scope/14063373#14063373 –

回答

94

attrs的目的是什么?为您的指令在相同的元素定义

属性有几个目的:

  1. 他们将信息传递到使用的分离范围指令的唯一途径。由于指令隔离范围没有从父范围原型继承,我们需要一种方法来指定我们想要传递给隔离范围的内容。 “对象散列”中的'@','='和'&'因此每个都需要一个属性来指定传递哪些数据/信息。
  2. 他们作为一个指导之间的沟通机制。 (例如,Managing communication between independent AngularJS directives independently
  3. 他们normalize的属性名称。

不能一次访问所有属性通过ATTRS通过呢?

是的,你可以,但

  1. 你不会有任何数据绑定。
    “@”设置单向“字符串”数据绑定(父范围→指令隔离范围)使用@您在指令中看到/获取的值始终是一个字符串,因此如果您尝试传递一个对象给你的指令。
    '='设置双向数据绑定(父范围↔指令隔离范围)。
    如果没有数据绑定,您的指令不能自动监视模型/数据。
  2. 属性值与{{}} s会导致你的问题,因为他们不会被插值。
    假设我们有<my-directive name="My name is {{name}}">,并且父范围有$scope.name='Mark'。然后,在链接功能中,console.log(attrs.name)结果为undefined
    如果name是用'@'定义的孤立范围属性,则attrs.$observe('name', function(val) { console.log(val) })的结果为My name is Mark。 (请注意,逻辑函数里面,$观察()必须用于获取插值)

为什么可以最大程度没有一个访问值作为attrs.max代替scope.max

回答上述

为什么分配回来就好attrs.max = scope.max?

我能想到这样做的唯一原因是在其他指令需要看到这个属性/值(即指令间通信)的情况下。但是,其他指令需要在此指令之后运行才能工作(可通过priority指令设置进行控制)。

摘要:在具有隔离范围的指令中,通常不想使用attrs。 (我想这可能是一种将初始化数据/值发送到指令的方式 - 也就是说,如果您不需要对这些值进行数据绑定,并且您不需要插值。)

+3

谢谢你的详细解答。我赞扬你的努力,特别喜欢你的文章https://github.com/angular/angular.js/wiki/The-Nuances-of-Scope-Prototypal-Inheritance。做得好。 – bsr

3

使用ATTRS你能够访问你的HTML代码中定义的属性,如

<fm-rating ng-model="$parent.restaurant.price" symbol="$" readonly="true"> 

因此,在这种情况下,你将有机会获得符号只读属性。您在自定义指令中定义的每个属性都可用于变量attrs变量。

块:

attrs.max = scope.max = parseInt(scope.max || 5, 10); 

威尔parse和分配当前scope.max值或,如果不存在,到scope.max和attrs.max。这样,作业完成后,您可以从attrs.max中读取。在此之前,未定义的attrs.max属性。

检查fmRating.js源码我不知道为什么/何地/何时使用这段代码。