应用
我正在开发一个基于 AngularJS 构建的简单 Web 应用程序。该应用程序应该能够离线和在线工作。当用户离线时,对数据的更改将存储在本地。因此,在此应用程序中在离线模式下使用的 id 只是临时 id,它们在上传到服务器时会被替换
问题
应用程序中使用的数据由复杂的对象(与其他对象的关系/引用)组成。当我保存到服务器时,我希望使用新的“真实”ID 更新视图。但是,由于 JavaScript 使用对象作为引用,我无法做我想做的事情:$scope.data = newdata
这不是覆盖 $scope.data 而是创建一个新对象。对旧数据的旧引用仍然存在。
简化示例
var x = {id: 1, name: "myObject"}
var c = x // c = {id: 1, name: "myObject"}
x = {id: 2, name: "myNewObject"}
// c = {id: 1, name: "myObject"}
如您所见, c 仍然是对旧对象的引用。实际上,这会导致我的视图没有使用新数据更新,因为它仍然绑定到旧数据。在这个例子中,我需要覆盖 x 的属性。我需要递归地执行此操作,因为我的真实对象很复杂,但是它不应该输入任何循环引用,因为这可能会导致堆栈溢出。如果我用 b 覆盖 a 并且 a 具有 b 没有的属性,则应删除这些属性。
我需要的
我需要某种函数,用 b(新对象)中的属性覆盖 a(旧对象)中的所有属性。所有存在于 a 中但不存在于 b 中的属性都应该被删除。