AngularJS指令隔离作用域声明中'=?<name>'的含义是什么
AngularJS隔离作用域
=?enumMapping写法语义说明 首先明确结论:等号后的问号没有额外特殊语义,它就是你已经了解的「可选双向绑定」标记,你看到的写法只是隔离作用域绑定声明的完整非简写形式而已。
绑定声明的完整语法规则
AngularJS隔离作用域的属性绑定字符串,遵循固定的三段式结构:<绑定模式><可选标记?><外部HTML属性名>
各部分含义:
- 绑定模式:固定为
=(双向绑定)、@(字符串单向绑定)、&(表达式/方法绑定)三类 - 可选标记
?:必须紧跟在绑定模式符号后才生效,代表当前绑定为可选项——如果指令使用时没有传入对应属性,不会抛出编译阶段的「非可选绑定缺失」错误,对应作用域属性值为undefined - 外部HTML属性名:指指令挂载的DOM元素上,要和当前作用域属性做绑定的属性名,支持驼峰命名自动匹配短横线分隔的HTML属性
写法等价性说明
你看到的enumMapping: '=?enumMapping',和你熟悉的简写写法enumMapping: '=?'运行效果完全一致。
两种写法的区别只在于是否省略了外部属性名:
- 当外部HTML属性名(转换为驼峰后)和指令本地作用域的属性名完全相同时,可以省略第三段的属性名,直接写
=?做简写,AngularJS会自动匹配同名属性 - 当外部属性名和本地作用域属性名不一致时,必须显式写全第三段的属性名,比如本地属性叫
selected,要绑定元素上的current-value属性,就需要写selected: '=?currentValue',这种场景下没有对应的简写形式。
示例验证
angular.module('demo').directive('enumSelector', function() { return { restrict: 'E', scope: { // 下面两行写法完全等价,保留任意一行即可 enumMapping: '=?enumMapping', // enumMapping: '=?' }, link: function(scope) { // 调用指令时如果没传enum-mapping属性,这里输出undefined,不会触发编译报错 console.log('绑定的枚举映射:', scope.enumMapping) } } })
注意:问号只有紧跟在绑定模式符号后才会被识别为可选标记,如果把问号写在属性名末尾,比如写成
=enumMapping?,AngularJS会把enumMapping?整体当成属性名去DOM上匹配,既不会生效可选逻辑,也找不到对应绑定属性,会抛出错误。
内容的提问来源于stack exchange,提问作者Khoa Nguyen
相关产品推荐
相关产品推荐

