AngularJS - 添加或编辑(动态)数据

时间:2014-10-25 09:31:40

标签: javascript angularjs dynamic

好的,所以我有一个案例,让我们说有一个报告,并且可以有几个用户附加到报告中。用户当然是对象,因此我们有三种类型的信息: 标题(字符串) 描述(字符串) 涉及(对象数组)

现在,已经有一个用户可以选择的预定义对象数组,所以自然的方法是使用select with ng-option,我已经完成了。 添加相关人员时,用户可以动态选择要添加的人数。编辑特定报告时,用户可以更改相关人员的值,删除人员或添加新人员。

到目前为止,我已经想到了这个(这是一个模拟现有报告的模拟,这些值来自Web服务): http://jsbin.com/poqiheputa/1/edit

很明显,如果我更改现有人员并提交数据,则不会更改该值。如果我添加一个人并将其设置为值,然后添加另一个人,则前一个值将消失。我完全在黑暗中,所以任何帮助都非常感谢!

1 个答案:

答案 0 :(得分:0)

您的问题是ng-model selectng-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}}也适用相同的逻辑。