Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJS-添加或编辑(动态)数据_Javascript_Angularjs_Dynamic - Fatal编程技术网

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

Javascript AngularJS-添加或编辑(动态)数据,javascript,angularjs,dynamic,Javascript,Angularjs,Dynamic,好的,我有一个案例,假设有一个报告,可以有几个用户附加到该报告。用户当然是对象,因此我们有三种类型的信息: 标题(字符串) 说明(字符串) 涉及(对象数组) 现在,已经有一个预定义的对象数组供用户选择,所以自然的方法是使用select with ng选项,我已经完成了。 添加相关人员时,用户可以动态选择要添加的人员数量。在编辑特定报告时,用户可以更改相关人员的值、删除人员或添加新人员 到目前为止,我已经想到了这个(这是一个模拟,您可以编辑现有的报告,这些值来自web服务): 很明显,如果我更改

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

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

到目前为止,我已经想到了这个(这是一个模拟,您可以编辑现有的报告,这些值来自web服务):


很明显,如果我更改了现有的相关人员并提交了数据,那么该值不会更改。如果我添加一个人并将其设置为一个值,然后添加另一个人,则上一个值将消失。我在这里一无所知,所以非常感谢您的帮助

您的问题是在
ng repeat
中包含的
select
中使用
ng model
的方式。这个解释有点牵强,不过我还是会试试的

ng repeat
为每个迭代创建一个新范围。在单个迭代的范围内,然后使用
i
ng模型创建
select
。但是您没有意识到的是,
ng模型
绑定是在该范围内创建的,而不是父范围。现在,当您修改
涉及的
集合时,
ng repeat
将重新触发并重新创建子作用域。由于该值从未传播到父作用域,因此它现在已丢失。您可以通过在某处添加一个
{{{included | json}
来观察这一点

有几种方法可以解决这个问题

一般的经验法则是,您的
ng模型中应该始终有一个点。实际上,这意味着您的
ng model
绑定应该引用对象上的属性,例如:
ng model=“model.property”
,并且您的父作用域应该有一个名为
model
的属性。然而,在您的情况下,
ng model=“included[$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
对象引用,并且由于它是一个引用,对它的一个属性的赋值将像它们应该的那样到处传播。由于数组也是对象引用,所以在ng repeat中,
涉及的[$index]
也适用相同的逻辑。

感谢您的解释!我想我更了解这一点。因此,我的解决方案如下:(不知道对象也会导致数组中的重复)数组不是集合,因此您可以多次向数组中添加任何值,包括对象引用。我也这么认为,但如果您查看此示例(没有track by$index)并尝试添加另一个账单,控制台会报告一个错误(重复),但是,使用track by$index时,不会出现此类错误。啊,这与数组本身无关,而是ng repeat的一个特性。