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
like
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隐藏):
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()
};

As
ng 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}

As
ng if
在将内部模板插入DOM时创建了一个子作用域,该子作用域通常从其当前作用域继承,因此在本例中,
ng模型在
ng if
的子作用域内创建。因此,在创建
子范围时,它会将
原语
数据类型值和
引用
(对象)数据类型值带到子范围,这就是为什么您可以看到外部范围
日期
日期字段(仅第一次)中获取值的原因。但是,当您在
date
中更新值时,将不会看到值更新到外部范围。因为
子作用域
的方式有create
基元类型
值不携带它们的引用,而as对象携带它们的引用。因此,您可以创建一个对象,如
$scope.model={}
&然后在其中定义一个属性,t