AngularJS 1.4指令:scope、双向绑定和bindToController
AngularJS 1.4 directives: scope, two way binding and bindToController
更新:代码的另一部分一定是愚蠢的东西。它现在可以工作了,所以bindToController语法很好。
我们使用的是AngularJS 1.4,它引入了一种在指令中使用bindToController的新方法。
经过相当多的阅读(可能并没有理解所有内容(,我们定义了我们的指令如下:
.directive('mdAddress', function mdAddress() {
var directive = {
restrict: 'EA',
scope: {},
bindToController: {
address: '='
},
templateUrl: 'modules/address/address.html',
controller: AddressController,
controllerAs: 'dir'
};
从另一个角度这样称呼它:
<md-address address="vm.address"></md-address>
已在视图控制器中预先定义:
vm.address = {
street: null,
countryCode: null,
cityCode: null,
postalCode: null
};
引用指令模板中的变量如下:
<md-input-container>
<label>{{'ADDRESSNUMBER' | translate}}</label>
<input type="number" ng-model="dir.address.streetNumber">
</md-input-container>
我们花了4个小时试图弄清楚为什么我们的指令不起作用。好吧,它起作用了,但控制器和指令之间的双向绑定不起作用,vm.address.street
被绝望地设置为null。
过了一段时间,我们只是尝试了老办法:
.directive('mdAddress', function mdAddress() {
var directive = {
restrict: 'EA',
scope: {
address: '='
},
bindToController: true,
templateUrl: 'modules/address/address.html',
controller: AddressController,
controllerAs: 'dir'
};
它神奇地起了作用。知道为什么吗?
更新:
感谢对这篇博客文章的引用,我需要更新我的答案。由于AngularJS 1.4,它真的看起来,你可以使用
scope: {},
bindToController: {
variable: '='
}
它将做与旧语法(完全(相同的事情:
scope: {
variable: '='
},
bindToController: true
AngularJS源代码中解释这种行为的有用行:
if (isObject(directive.scope)) {
if (directive.bindToController === true) {
bindings.bindToController = parseIsolateBindings(directive.scope,
directiveName, true);
bindings.isolateScope = {};
} else {
bindings.isolateScope = parseIsolateBindings(directive.scope,
directiveName, false);
}
}
if (isObject(directive.bindToController)) {
bindings.bindToController =
parseIsolateBindings(directive.bindToController, directiveName, true);
}
来源:AngularJS 1.4.0
原始答案:
希望我能向您解释为什么您所经历的这种行为是正确的,以及您在哪里误解了范围绑定的概念。
让我解释一下,你在第一个代码片段中做了什么:
.directive('mdAddress', function mdAddress() {
var directive = {
restrict: 'EA',
scope: {},
bindToController: {
address: '='
},
templateUrl: 'modules/address/address.html',
controller: AddressController,
controllerAs: 'dir'
};
使用scope: {}
,您为mdAddress
指令创建了一个独立的作用域(没有任何继承(。这意味着:在父控制器和指令之间不传递任何数据。
考虑到这一点,关于您的第二个代码片段:
<md-address address="vm.address"></md-address>
父控制器/视图中的vm.address
将作为表达式分配给指令的地址属性,但由于您之前定义了一个隔离作用域,因此数据不会传递到AddressController
中,因此在bindToController
值中不可用。
让我们将scope
对象定义视为"将传入哪些数据",将bindToController
视为"哪些数据将在我的视图的controllerAs对象中可用"。
所以,现在让我们来看看最后一个(也是正在工作的代码片段(:
.directive('mdAddress', function mdAddress() {
var directive = {
restrict: 'EA',
scope: {
address: '='
},
bindToController: true,
templateUrl: 'modules/address/address.html',
controller: AddressController,
controllerAs: 'dir'
};
在那里,您也创建了一个独立的作用域,但这次添加了要作为表达式传入的address
属性。因此,现在您从第二个代码段中的视图传入的address
将在控制器的作用域中可用。现在设置bindToController: true
,将把当前作用域的所有属性绑定到控制器(或者更可能是控制器的对象(。现在,它正如您所期望的那样工作,因为数据将传递到作用域,而数据将传递给控制器的模板作用域。
这个简短的概述是否有助于您更好地理解scope
和bindToController
定义对象的概念?
- 在VanillaJS中模拟模型双向数据绑定
- 无法通过数组映射绑定
- 主干-不管怎样,检查事件以前是否绑定过
- 用于搜索的聚合物嵌套绑定
- Angular:更新一次性绑定的数据
- 如何使用ngrepeat和双向绑定获得指令的隔离范围
- react.js中的密钥绑定
- 使用regex的jquery keydown绑定不会验证撇号和句点
- 将事件处理程序绑定到任何可能的事件
- AngularJS指令只识别双向绑定类型
- Telerik rad组合框多列数据绑定
- 对API数据使用声明性绑定
- 如何销毁/删除/取消绑定SnapSVG.js
- 在D3.js中,有没有任何方法可以将x和y方向上的滚动事件绑定到平移svg
- 数据绑定:'系统Char'不包含名为'xxxxx'
- react组件中的绑定方法
- 如何将ngrepeat下的ngmodel绑定到$scope
- WinJS内联绑定语法
- ng绑定和ng href问题.ng href未从控制器加载数据
- 如何在动态创建的节点上绑定函数