更新 :在代码的另一部分中一定有些愚蠢。现在可以使用,因此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
来自您的父控制器/视图的数据将作为表达式分配给指令的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
现在设置,会将当前作用域的所有属性绑定到控制器(或更可能是controllerAs对象)。现在,它可以按您期望的那样工作,因为数据将被传递到合并范围,并且数据将被传递到控制器的模板范围。
简要概述是否有助于您更好地理解scope
和bindToController
定义对象的概念?
问题内容: 如果我有一个没有模板的AngularJS指令,并且希望它在当前作用域上设置一个属性,那么最好的方法是什么? 例如,计算按钮点击次数的指令: 使用伪指令将点击计数分配给双向属性中的表达式: 有一个更好的方法吗?从我所读的内容来看,孤立的作用域会过大,但是我需要一个子作用域吗?除了使用以外,还有没有更干净的方法可以写回指令属性中定义的范围变量。我只是觉得我很难过。 这里有完整的柱塞。 问题
问题内容: 我一直在尝试定义指令,以便可以根据字段的类型及其参数(存储在数据库中)以表格形式显示不同的“窗口小部件”。我需要对不同类型的场景做出反应,因此需要使用指令来处理布局。 在玩一些示例时,我想出了 kinda 可以工作的代码: HTML 指示 这似乎可行(尽管明显比* proper * angularJS变量绑定要慢),但我认为必须有更好的方法来做到这一点。谁能阐明这件事? 问题答案: 我
Mpx针对表单组件提供了wx:model双向绑定指令,类似于v-model,该指令是一个语法糖指令,监听了组件抛出的输入事件并对绑定的数据进行更新,默认情况下会监听表单组件的input事件,并将event.detail.value中的数据更新到组件的value属性上。 简单实用示例如下: <view> <input type="text" wx:model="{{message}}"> <
双向绑定这个概念在angular出现的时候,就作为王牌概念. 现在几乎是个js前端框架,就有这个功能. 它的概念是: 某个变量, 如果展现在页面上的话: 如果在代码层面进行修改, 那么页面的值就会发生变化 如果在页面进行修改(例如在input标签中), 那么代码的值就会发生变化. 一个演示例子. 在我们的项目中,增加一个 vue页面: src/components/TwoWayBinding.vu
单向绑定非常简单,就是把Model绑定到View,当我们用JavaScript代码更新Model时,View就会自动更新。 有单向绑定,就有双向绑定。如果用户更新了View,Model的数据也自动被更新了,这种情况就是双向绑定。 什么情况下用户可以更新View呢?填写表单就是一个最直接的例子。当用户填写表单时,View的状态就被更新了,如果此时MVVM框架可以自动更新Model的状态,那就相当于我
问题内容: 我有一个双向数据绑定,它不会更改发送到指令的变量的值。 我的指令监视触发器,并将焦点集中在associates元素上(基于在SO处找到的代码): 在HTML中,我将其称为: 当我第一次触发它时,它可以工作- 因为变量会切换其值。但是在控制器范围内(指令外部)不会在指令完成时切换回原来的状态。 假设我了解应该发生的情况,则在致电时切换回应该发生的情况。 缺少什么会导致双向绑定不将值推回传