我讨厌提出愚蠢的问题,但遗憾的是,AngularJS文档编写者似乎忘了澄清一切。
创建指令时,您可以通过以下代码将指令中的变量链接到HTML中的变量:
angular.module('app', []).directive('someModule', ['$window', function($window) {
return {
restrict: 'E',
transclude: true,
template: '...',
scope: {
x: '=',
front: '@',
markers: '=?'
},
controller: ...
}]);
我理解'='
后的x
表示x=x
,但@
和?=
是什么意思?
答案 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}}是一个表达式,将根据父作用域进行评估 - 一种让隔离范围访问父作用域的方法。