范围是什么:[variable-name] ='@'在Angular中意味着什么?

时间:2015-08-20 21:06:15

标签: javascript angularjs scope

我讨厌提出愚蠢的问题,但遗憾的是,AngularJS文档编写者似乎忘了澄清一切。

创建指令时,您可以通过以下代码将指令中的变量链接到HTML中的变量:

angular.module('app', []).directive('someModule', ['$window', function($window) {
  return {
    restrict: 'E',
    transclude: true,
    template: '...',
    scope: {
      x:          '=',
      front:      '@',
      markers:    '=?'
    },
    controller: ...
  }]);

我理解'='后的x表示x=x,但@?=是什么意思?

2 个答案:

答案 0 :(得分:0)

@表示one way binding指令隔离范围变量。

如果绑定范围变量在控制器内部已经放置了元素,那么将更改指令隔离范围,但指令隔离范围的更改将不会被控制器监听where指令所在。

需要一个表达式来为隔离的范围变量赋值。

示例

<my-directive foo-id="{{fooId}}"></my-directive>

<强>指令

scope: {
   'fooId': '@'
}

当指令的fooId发生变化时,表达式将被计算并将该值发送到隔离范围变量的fooId。您可以使用scope.fooId访问该隔离范围。如果从指令更改scope.fooId将更改fooId变量的绑定,该变量位于父控制器where指令所在的位置。这就是为什么它被称为单向绑定,因为它不会以相反的方式更新绑定。

'=?'

它的含义是你可以使用=双向绑定,但?表示它是一个可选字段后,属性的值可以是可选的=

如果仅使用=而不使用?,那么您需要在该属性中提供变量引用的值。那不会发生,然后angular会因角度而产生noassign错误。

答案 1 :(得分:0)

我认为考虑"{{something}}"的最佳方式是它为您提供DOM属性的<(em>字符串)文字值。不要担心将其称为单向约束,或任何废话 - 这只是令人困惑。

如果值恰好被内插并且您在插值之前检查了值,那么您将获得=,但是在插值发生之后,您将获得插值。

这与{{1}}显着不同,{{1}}是一个表达式,将根据父作用域进行评估 - 一种让隔离范围访问父作用域的方法。