关于javascript:Angularjs指令:隔离范围和attrs

Angularjs directive: Isolated scope and attrs

请看这里的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
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,以便从父作用域访问它。

它在这里使用

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

为什么要像attrs.max = scope.max那样分配回?

因为这个应用程序是由Angular的作者编写的,我想是有原因的。

谢谢。


what is the purpose of attrs?

在与指令相同的元素上定义的属性有几个用途:

  • 它们是将信息传递到使用隔离作用域的指令中的唯一方法。由于指令isolate scope不是从父作用域原型继承的,因此我们需要一种方法来指定要传递给isolate scope的内容。"@因此,"对象哈希"中的"、"="和"&;"都需要一个属性来指定要传递的数据/信息。
  • 它们是一种指令间通信机制。(例如,独立管理安格拉尔JS指令之间的通信)
  • 它们规范化属性名。
  • Can't one access all the attributes passed through attrs?

    是的,你可以,但是

  • 您将没有任何数据绑定。"@"设置单向"string"数据绑定(父作用域&8594;指令隔离作用域),其中@您在该指令中看到/获取的值始终是字符串,因此如果您试图将对象传递给指令,请不要使用该值。'='设置双向数据绑定(父作用域&8596;指令隔离作用域)。如果没有数据绑定,您的指令就不能$watch或$observer自动更改模型/数据。
  • 使用{{}}s的属性值将导致问题,因为它们不会被插值。假设我们有,父范围有$scope.name='Mark'。然后,在链接函数内部,console.log(attrs.name)生成undefined。如果name是用"@"定义的独立作用域属性,那么attrs.$observe('name', function(val) { console.log(val) })将导致My name is Mark。(注意,在链接函数内部,必须使用$observer()来获取插值值。)
  • Why can't one access value of max as attrs.max instead of scope.max

    以上回答

    Why assign back like attrs.max = scope.max ?

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

    摘要:在带有隔离作用域的指令中,通常不希望使用attrs。(我认为这可能是将初始化数据/值发送到指令中的一种方法——即,如果您不需要这些值的数据绑定,也不需要插值。)


    使用attrs,您可以访问在HTML标记中定义的属性,例如

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

    因此,在本例中,您将可以访问符号和只读属性。您在自定义指令中定义的每个属性都将可用于ATTRS变量。

    街区:

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

    将分析并将当前scope.max值或5(如果不存在)分配给scope.max和attrs.max。这样,在分配之后,可以从attrs.max.中读取未定义的attrs.max属性。

    检查fmtrating.js源,我不知道为什么/在哪里/何时使用这段代码。