Angularjs指令:隔离范围和attrs

时间:2013-01-13 05:35:29

标签: javascript angularjs

请参阅示例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需要symbolmaxreadonly以从父范围访问它。

使用here

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

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

为什么要回拨attrs.max = scope.max

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

感谢。

2 个答案:

答案 0 :(得分:94)

  

attrs的目的是什么?

在与指令相同的元素上定义的属性有以下几个目的:

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

    无法访问通过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。 (注意,在链接函数内部,必须使用$ observe()来获取插值。)
    3.   

      为什么不能将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源我不知道为什么/何时/何时使用这段代码。