Javascript 更改服务返回的数据也会更改服务中的数据

Javascript 更改服务返回的数据也会更改服务中的数据,javascript,angularjs,angularjs-service,Javascript,Angularjs,Angularjs Service,当我将从服务返回的数据存储在控制器中并对其进行编辑时,它也会更改服务中的数据 这用于标记编辑器。我想将数据从服务加载到控制器中,然后编辑它,然后按“保存”按钮为服务提供新版本。 如果上述行为在Angular的数据绑定方面是正确的,那么有什么更好的解决方案可以实现我想要的呢 更新 基于的注释,我更改了getData()函数,使用angular.copy()返回副本。但是,似乎不可能从数组中复制一个对象(如angular.copy(arr[0])),因为它仍然会返回整个数组。看 更新2 好吧,我很

当我将从服务返回的数据存储在控制器中并对其进行编辑时,它也会更改服务中的数据

这用于标记编辑器。我想将数据从服务加载到控制器中,然后编辑它,然后按“保存”按钮为服务提供新版本。 如果上述行为在Angular的数据绑定方面是正确的,那么有什么更好的解决方案可以实现我想要的呢

更新

基于的注释,我更改了
getData()
函数,使用
angular.copy()
返回副本。但是,似乎不可能从数组中复制一个对象(如
angular.copy(arr[0])
),因为它仍然会返回整个数组。看

更新2


好吧,我很傻。我纠正了它。谢谢您的回答。

这是因为您正在返回一个对象。在javascript中,这样做就像传递指针一样

应使用angular.copy逐字段复制对象,如下所示:

        return angular.copy(data);
var copyOfA = JSON.parse(JSON.stringify(a));
看这里的医生

对您的更新的响应

我编辑了你的小提琴,向你展示了你可以复制数组中的一项。事实上,似乎每件事都像你想的那样。。。(或者我不明白你的需要!)

更新的小提琴:


有一个非常简单的解决方案:

如果您不想更改从服务获取的数据,请复制一份

这里有很多线程,因此讨论了深度复制Javascript对象的快速或最优雅的方法。一个简单而快速的解决方案是使用json解析和字符串化,如下所示:

        return angular.copy(data);
var copyOfA = JSON.parse(JSON.stringify(a));

将这一点应用于您从服务中获得的数据,您就可以开始了:)

这就是服务在角度上工作的设计方式。为什么您不想在应用程序中将数据一直更改回其根目录?因为您正在将服务对象的对象引用带到控制器..并且该对象中的更新将更新服务中的数据..对象是可变的,这就是为什么控制器中的编辑会反映在您的服务中,这对于保持应用程序的正确状态并不一定是好的。从服务返回数据时,使用
angular.copy
克隆数据。我不一定同意
这是服务在angular中工作的方式
。因为这是一件坏事,除非你正在编写一些小的测试应用程序或POC。您应该避免以非显式的方式改变应用程序的状态,大多数设计模式都遵循这种方式,包括流量和不变的数据存储;发布的是一个使用angular 1.0.1的通用应用程序(可能不是您想要的)。@Bendelport您可能应该从服务返回一份数据副本,如果要保存,请通过显式保存方法接受要保存在服务中的数据,请调用服务器更新并更新存储中的本地集合。如果要通知更改,则在保存成功后从启动组件发出通知,以便依赖于相同状态的其他组件可以刷新自身。你可能想看看flux甚至RXObservables,尤其是为了实现更好的设计,尤其是如果你有一个相当大的应用程序。这里的问题是,似乎不可能像我更新的问题中所解释的那样从数组中深度复制对象。我只是忘了在控制器的函数调用中包含ID,这当然会返回整个数组。我觉得自己很愚蠢^^