Angular - 在 ngInclude 中调用时 ngModel 不更新

Posted

技术标签:

【中文标题】Angular - 在 ngInclude 中调用时 ngModel 不更新【英文标题】:Angular - ngModel not updating when called inside ngInclude 【发布时间】:2013-04-02 22:10:04 【问题描述】:

首先是笨蛋:http://plnkr.co/edit/v1uTz5

这是我遇到的问题的工作演示。

我有一个 ng-include 来包含部分内容。

在部分内部,我有一个带有ngModel AND 指令的文本输入。

模型在包含内相应地更新,但包含外的任何交互都将被忽略。包含外部的 test 不会更新,但内部的 test 会更新。

该指令在调用时处理enter 键并调用正确的范围和函数。但是,$scope.test 变量从未更新,但 $scope.testFinal 已更新,ng-include 模板会适当地呈现它。尝试重置$scope.test 模型也不起作用。

我在这里遗漏了什么吗?或者这是指令或ng-include 的错误?

【问题讨论】:

见***.com/questions/11412410/… 【参考方案1】:

ng-include 创建自己的作用域,它不同于外部作用域。在ng-include 模板中使用this.test 而不是$scope.test。它会正常工作。

【讨论】:

【参考方案2】:

不要使用原语来定义变量,而是让它成为一个对象。

$scope.model=test:'';

指令为每个项目创建自己的范围。当您将原语等同于新的范围变量时,它与原始变量没有绑定,但是当原始变量是对象时,将创建一个引用,而不是副本,并且在其中所做的更改将反映在另一个中

简单的解释性例子:

var a ='foo';
var b= a;
/* now change a*/
a='bar';
alert( b) // is still 'foo'

现在对对象做同样的事情:

var obj_1= a:'foo';
var obj_2=obj_1;
/* now change obj_1.a*/
obj_1.a='bar';
alert( obj_2.a) // change to obj_1 will also change obj_2 and alert returns "bar"*/

Your Plunker Modified

Read this article on angular wiki for more detailed explanation

【讨论】:

很简单,我一直都知道,但一直不明白原因。谢谢你的文章。它绝对应该在他们的网站上获得更多的代表。 谢谢,你节省了我几个小时。 角度 wiki 链接不再有效。 这是唯一对我有用的解决方案。使用 this.varName 或 $parent.varName 什么都不做。谢谢!【参考方案3】:

John Lindquist 对此有一个 video。虽然他没有完全解释为什么你需要使用一个对象。

基本上每次有一个新的非隔离作用域时,父作用域的每个属性都会复制到新作用域,正如@charlietfl 解释的那样,复制原始类型真的会创建一个“副本" 但是对于对象,您得到的是参考,因此更改是全局

【讨论】:

以上是关于Angular - 在 ngInclude 中调用时 ngModel 不更新的主要内容,如果未能解决你的问题,请参考以下文章

AngularJs练习Demo10 ngInclude

Angular JS 和部分

如何在 AngularJS 中为 ngInclude 指令指定模型?

AngularJS:ngInclude vs 指令

注入的 cshtml 文件中的 Angular,$compile 不起作用

使用 nginclude 时避免使用额外的 DOM 节点