Javascript ng模型未在范围外更新
我正在将一个Javascript ng模型未在范围外更新,javascript,angularjs,Javascript,Angularjs,我正在将一个ng模型绑定到一个输入,但是它绑定到的变量的值没有在声明该指令的div之外更新: <div input-field ng-if="startTypes.selected.value == 'LocalDate' || startTypes.selected.value == 'LocalDateTime'"> <input id="date" type="text" ng-model="date" input-date> <label
ng模型
绑定到一个输入,但是它绑定到的变量的值没有在声明该指令的div
之外更新:
<div input-field
ng-if="startTypes.selected.value == 'LocalDate' || startTypes.selected.value == 'LocalDateTime'">
<input id="date" type="text" ng-model="date" input-date>
<label for="date">Date</label>
Date inner scope: {{date}}
</div>
Date outer scope: {{date}}
日期
日期内部作用域:{Date}
日期外部作用域:{Date}
选择新日期时,只更新内部日期。外部值保留旧值(可能是未定义的
,或者不取决于我是否在控制器中声明了它,这无关紧要)
我正在使用,我不确定这是否是问题的根源,但它没有意义,因为它是angular使用CSS框架的特定框架
是我正在使用的组件
编辑:
我已尝试在控制器中将
日期声明为$scope.date=new date()
,实际上当前日期已加载到日期选择器中。但是,当选择了日期且模型发生更改时,它仅在本地更新(内部范围),而在外部范围内旧值保持不变。ngIf
likengRepeat
指令创建自己的$scope
因此,在这种特定情况下,您可以使用ng show
而不是ng if
发件人:
ngIf指令删除或重新创建DOM树的一部分
基于{表达式}。如果指定给ngIf的表达式计算
如果设置为false值,则该元素将从DOM中删除,否则
元素的克隆将重新插入DOM
示例:
angular.module('app',[])
.controller('mainCtrl',函数($scope){
$scope.testa=false;
$scope.testb=false;
$scope.testc=false;
$scope.testd=false;
});代码>
测试A:{{testa}}
测试B:{{testb}
测试C:{{testc}
测试D:{{testd}
测试(如果没有ng):
testb(如果有ng):
testc(带ng show):
testd(带ng隐藏):
ngIf
类似于ngRepeat
指令创建自己的$scope
因此,在这种特定情况下,您可以使用ng show
而不是ng if
发件人:
ngIf指令删除或重新创建DOM树的一部分
基于{表达式}。如果指定给ngIf的表达式计算
如果设置为false值,则该元素将从DOM中删除,否则
元素的克隆将重新插入DOM
示例:
angular.module('app',[])
.controller('mainCtrl',函数($scope){
$scope.testa=false;
$scope.testb=false;
$scope.testc=false;
$scope.testd=false;
});代码>
测试A:{{testa}}
测试B:{{testb}
测试C:{{testc}
测试D:{{testd}
测试(如果没有ng):
testb(如果有ng):
testc(带ng show):
testd(带ng隐藏):
绑定到ngModel
时,应使用具有属性的对象
$scope.form = {
date: new Date()
};
绑定到ngModel
时,应使用具有属性的对象
$scope.form = {
date: new Date()
};
Asng if
创建一个子范围,该子范围在将内部模板插入DOM时从其当前范围原型继承,因此在本例中,在ng if
的子范围内创建ng model
。因此,在创建子范围时,它会将原语
数据类型值和引用
(对象)数据类型值带到子范围,这就是为什么您可以看到外部范围日期
在日期字段(仅第一次)中获取值的原因。但是,当您在date
中更新值时,将不会看到值更新到外部范围。因为子作用域
的方式有create基元类型
值不携带它们的引用,而as对象携带它们的引用。因此,您可以创建一个对象,如$scope.model={}
&然后在其中定义一个属性,这将起作用。因为对象带有对子范围的引用,所以更新内部对象也会同步外部对象(它们都是相同的)。此规则称为点规则
,您可以通过此规则解决问题
$scope.model = {};
$scope.model.date = new Date();
避免这种范围层次结构的更方便的方法是在HTML上使用controller时使用controllerAs
模式。在这种情况下,您不应该使用$scope
,而是将所有属性绑定到控制器函数上下文(this
)。此后,在使用控制器时,您可以使用控制器的别名来获取控制器的值,如ng controller=“myCtrl as vm”
(此处vm
是控制器的别名,其所有信息都绑定到此
)
HTML
<div input-field
ng-if="vm.startTypes.selected.value == 'LocalDate' || vm.startTypes.selected.value == 'LocalDateTime'">
<input id="date" type="text" ng-model="vm.date" input-date>
<label for="date">Date</label>
Date inner scope: {{vm.date}}
</div>
Date outer scope: {{vm.date}}
日期
日期内部作用域:{vm.Date}
日期外部作用域:{vm.Date}
Asng if
在将内部模板插入DOM时创建了一个子作用域,该子作用域通常从其当前作用域继承,因此在本例中,ng模型在ng if
的子作用域内创建。因此,在创建子范围时,它会将原语
数据类型值和引用
(对象)数据类型值带到子范围,这就是为什么您可以看到外部范围日期
在日期字段(仅第一次)中获取值的原因。但是,当您在date
中更新值时,将不会看到值更新到外部范围。因为子作用域
的方式有create基元类型
值不携带它们的引用,而as对象携带它们的引用。因此,您可以创建一个对象,如$scope.model={}
&然后在其中定义一个属性,t