我有两个文本输入,一个在根范围内,另一个在控制器的范围内,
<input type="text" ng-model="message">
当我在第一个输入中给出“q”时,在根范围中创建了一个属性“message”。当我在第二个输入中给出“a”时,在控制器的范围内创建了一个属性“message”。
现在我在范围中引入一个对象,
<input type="text" ng-model="data.message">
当我在第一个输入中给出“q”时,在根范围中创建了一个属性“data”。当我在第二个输入中给出“a”时,控制器范围内没有创建属性“data”。
为什么会这样?
谢谢,
Eric J.
答案 0 :(得分:2)
Angular范围依赖于Javascript Prototypal继承。
归结为什么,如果你在一个范围上设置一个属性,那么任何子范围都能够读取它。 如果要写回该属性,则必须显式获取其设置的范围,否则会创建所谓的“影子”模型,这是您在父作用域上设置属性然后在儿童范围内重写它。
解决这个问题的方法就像你发现的那样,将作用域上的属性设置为对象,然后在该对象上设置属性时,附加到作用域的对象会更新,而不是作用域。由于您的对象是一个普通的旧js对象,它可以按照您的预期工作,能够在您喜欢的地方进行更新和阅读。