何时(或不是)是在控制器范围内创建的属性?

时间:2013-06-14 10:27:35

标签: angularjs

我有两个文本输入,一个在根范围内,另一个在控制器的范围内,

<input type="text" ng-model="message">

当我在第一个输入中给出“q”时,在根范围中创建了一个属性“message”。当我在第二个输入中给出“a”时,在控制器的范围内创建了一个属性“message”。

现在我在范围中引入一个对象,

<input type="text" ng-model="data.message">

当我在第一个输入中给出“q”时,在根范围中创建了一个属性“data”。当我在第二个输入中给出“a”时,控制器范围内没有创建属性“data”。

为什么会这样?

谢谢,

Eric J.

1 个答案:

答案 0 :(得分:2)

Angular范围依赖于Javascript Prototypal继承。

归结为什么,如果你在一个范围上设置一个属性,那么任何子范围都能够读取它。 如果要写回该属性,则必须显式获取其设置的范围,否则会创建所谓的“影子”模型,这是您在父作用域上设置属性然后在儿童范围内重写它。

解决这个问题的方法就像你发现的那样,将作用域上的属性设置为对象,然后在该对象上设置属性时,附加到作用域的对象会更新,而不是作用域。由于您的对象是一个普通的旧js对象,它可以按照您的预期工作,能够在您喜欢的地方进行更新和阅读。