当前位置: 首页 > 面试题库 >

ng-model未在范围外更新

温举
2023-03-14
问题内容

ng-model将an 绑定到输入,但是绑定到该变量的值未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会更新。外部的那个仍然是旧值(可能undefined取决于我是否在控制器中声明了它,这无关紧要)。

我正在使用angular-materialize,我不确定这是否是问题的根源,但是没有意义,因为这是与CSS框架materializecss一起使用的特定的angular框架。

这是我正在使用的组件。

编辑:

我试过date在控制器中声明为,$scope.date = new Date()并且确实将当前日期加载到日期选择器中。但是,当选择日期并更改模型时,只会在本地(内部范围)进行更新,而在外部范围中则保留旧值。


问题答案:

As ng-if创建一个子作用域,该子作用域在将内部模板插入DOM时从其当前作用域原型继承而来,因此在这种情况下ng-model将在其ng- if子作用域内创建。因此,发生的事情是在创建一个child scopeprimitive数据类型值和reference(对象)数据类型值携带到子作用域时,这就是为什么您可以看到外部作用域dateng- if日期字段(仅第一次)中获取值的原因。但是,当您更新值时,date您将看不到该值被更新到外部范围。因为该方式child scope具有创造primitive type价值,所以不携带其引用,而对象随其引用一起携带。所以你可以创建一个像$scope.model = {}&然后在其中定义一个属性,它将起作用。因为对象带有它们对子作用域的引用,所以更新内部对象也将同步外部对象(它们都是相同的)。可以使用此规则Dot Rule来解决问题。

$scope.model = {};
$scope.model.date = new Date();

避免这种范围层次结构的更方便的方法是controllerAs在HTML上使用控制器时使用模式。在这种情况下,您不应该使用$scope所有属性,而是将所有属性绑定到控制器功能上下文(this)。此后,在使用controller时,您可以使用aliascontroller来获取controller的值,例如ng- controller="myCtrl as vm"(这vm是controller的别名,其中所有信息都绑定到this

的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}}


 类似资料:
  • 问题内容: 经过数小时令人沮丧的搜索,我觉得我需要在这里提交我的问题。如果此问题以前得到过解答,我事先表示歉意,但是到目前为止,我的搜索都没有帮助。所以这是我的问题: 我的JavaScript代码正在创建一个对象,该对象由AngularJS修改和监视。对于某些事件(例如加载对象的先前设置),我希望从范围之外更改该对象的属性。问题是输入不会改变… 这是我希望如何执行这些更改的示例: HTML代码:

  • 问题内容: 我正在尝试创建一个select元素,该元素的页面编号为1,其中pages是一个变量,即我所拥有的页面数。我不知道该怎么做,是为了构造ng- options表达式,以便它将给我所需的数字。这是我到目前为止的 我需要在ng-options表达式中放置什么才能使其创建我的select 我是否需要创建一个返回数字数组的函数并以某种方式在其中使用它,还是有一种更简单的方法呢? 任何帮助将不胜感激

  • 问题内容: 我正在使用离子型,并且具有以下视图: 而我的控制器: 我不明白的是,当我单击按钮时,登录功能被正确调用。另外,如果我在控制器中设置为“香蕉煎饼”之类的内容,则视图实际上会更新。 但是,当登录功能实际运行时,会提示未定义MembershipNo和密码。我是Angular和Ionic的新手,所以我知道这可能是一些n00b错误… 问题答案: 修改后的报价: “如果使用ng-model,则必须

  • 问题内容: 这是我不工作的演示 模型保持不变。如何同步?请注意,数据结构很重要。 问题答案: 的结合将评估在当前范围的表达。作为创建一个子范围,这意味着将寻找一个命名属性的子范畴。在您的示例中,我们希望它在 父 范围内查找属性,该属性的别名为。 这是设计使然,可以通过引用表达式中的父范围来避免这种情况。 工作演示 代码(注意输入元素上的绑定已更改): 当您使用Angular 1.3的Beta版时,

  • 问题内容: 如果我的措词不正确,我事先表示歉意。我在的内部有一个文本框,当我尝试获取文本框值时始终为。我只希望它显示我在相应文本框中键入的内容。 似乎是一个问题,那么我该如何创建全局或控制器根级别以便可以访问它? 这是帮助解决问题的JSFiddle:http : //jsfiddle.net/stevenng/9mx9B/14/ 问题答案: 在您的点击表达式中,您可以引用并在您的函数中对其进行访问

  • 问题内容: 我创建了以下示例,以便您可以确切了解正在发生的事情:http : //jsfiddle.net/8t2Ln/101/ 如果我使用ng-options,也会发生同样的事情。我这样做有不同的原因,但由于简化了示例,所以省略了这一部分。 如您所见,默认情况下它具有两个选项。我将在选择旁边显示ng- model的选择值,以便您可以看到它的含义。当您在顶部添加第三个选项时,它会将值设置为该新选项