好的,所以我有一个案例,让我们说有一个报告,并且可以有几个用户附加到报告中。用户当然是对象,因此我们有三种类型的信息: 标题(字符串) 描述(字符串) 涉及(对象数组)
现在,已经有一个用户可以选择的预定义对象数组,所以自然的方法是使用select with ng-option,我已经完成了。 添加相关人员时,用户可以动态选择要添加的人数。编辑特定报告时,用户可以更改相关人员的值,删除人员或添加新人员。
到目前为止,我已经想到了这个(这是一个模拟现有报告的模拟,这些值来自Web服务): http://jsbin.com/poqiheputa/1/edit
很明显,如果我更改现有人员并提交数据,则不会更改该值。如果我添加一个人并将其设置为值,然后添加另一个人,则前一个值将消失。我完全在黑暗中,所以任何帮助都非常感谢!
答案 0 :(得分:0)
您的问题是ng-model
select
中ng-repeat
中使用ng-repeat
的问题。解释有点涉及,但我会尝试。
select
为每个迭代创建一个新范围。在单个迭代的范围内,然后创建ng-model
i
ng-model
的{{1}}。但是你没有意识到的是involved
绑定是在该范围内创建的,而不是父范围。现在,当您修改ng-repeat
集合时,{{involved|json}}
重新触发并重新创建子范围。由于该值从未传播到父作用域,因此它现在已丢失。您可以通过在某处添加ng-model
来观察此操作。
有几种方法可以解决这个问题。
一般的经验法则是,您的ng-model
中应该总是有一个点。实际上,这意味着您的ng-model="model.property"
绑定应引用对象上的属性,如下所示:model
并且您的父作用域应具有名为ng-model="involved[$index]"
的属性。但是,在您的情况下,parent.foo = 1;
child.foo === 1; // this is true even if nobody sets child.foo
似乎是更好的选择。
所有这一切的原因都与原型继承有关。创建子作用域时,它会从其父作用域继承属性,如下所示:
parent.foo = 1;
child.foo === 1; // true
child.foo = 2;
child.foo === 2; // true
parent.foo === 1; // still true -- child now has its own, overriding foo property
但是,如果您设置了子属性的值,它只会在子范围内覆盖它:
parent.foo = { bar = 1 };
child.foo.bar === 1; // true
child.foo.bar = 2;
parent.foo.bar === 2; // true!
但是如果使用对象或数组,事情会有所不同:
foo
这看起来有点令人惊讶,但原因其实很简单:子范围从其父级继承involved[$index]
对象引用,并且由于它是引用,因此对其中一个属性的赋值将在任何地方传播,他们应该这样。由于数组也是对象引用,因此ng-repeat中的{{1}}也适用相同的逻辑。