我想要 AngularFire t Obsersable 的冻结副本

I want a frozen copy of AngularFire t Obsersable

好的,让我来解释一下。我正在从 AngularFire 数据库中获取一个可观察对象,这是我假装要做的事情: - 获得 2 个可观察响应的静态副本 - 显示 1 个静态副本 - 允许用户修改这个静态副本而不保存它 - 当用户决定取消更改时,我只需获取副本编号 2 并将其设置为副本编号 1。

变得引人注目:

this.afoDatabase.object("usuarios/"+this.userKey+"/pacientes/"+this.pacienteKey).map(res=> {
  this.model = res;
  this.model2 = res;
}).first().toPromise();

当用户决定取消更改时,这就是我正在做的:

this.model = this.model2;
  // this.model is the copy number 1 and this.model2 is the 'unchanged' copy number 2

但是当我这样做时,副本号 2,即使我从未显示或更改它,也完全等于副本号 1;

Map用于修改每个事件中接收到的数据。 所以你需要像

这样的模型分配数据
.first((data) => model = data)

然后使用

.subscribe((data) => model2 = data)

如果你想修改数据格式,你可以调用

.map((data) => { let res = modifyData(data); return res});

更新:

import { timer } from 'rxjs/observable/timer';
import 'rxjs/add/operator/first';

let model, model1;

let observable = timer(0, 1000);

observable.first().subscribe((n) => { 
  model = n;
});

observable.subscribe((n) => {
  model1 = n;
});

已更新

您可以像

一样使用 combineLatest
let supplier = this.afoDatabase.object("usuarios/" + this.userKey + "/pacientes/" + this.pacienteKey);
Observable.combineLatest(supplier, supplier)
  .map([model1, model2]=> {
    this.model1=model1;
    this.model2=model2;
  }).first()
  ...

CombineLatest 将在这两个 observable 发出时发出一个数组。这里 model1model2 应该具有相同的值。

注意:这将创建两个单独的请求。如果您想创建单个请求,请查看下面的上一个答案。

上一个答案

看这里

let res = {foo:1,bar:2}
let model1 = res;
let model2 = res;
model1.foo=3;
console.log(model1.foo) //3
console.log(model2.foo) //3

因为当我们声明 model1model2 的值为 res 时,它们都指向同一个对象。两者都持有同一对象的引用(这里 res)并且改变一个会改变另一个。

您需要做的是将 res 克隆到 model2,这样它将是一个与 res 具有相同值的不同对象。克隆分浅层和深度两种。

  1. Efficient deep copy
  2. Shallow copy
  3. Difference between shallow and deep copy.

如果您的 res 对象值是字符串、数字等,那么您需要浅拷贝。示例

res= {a:1,b:"2"}

如果它们包含数组,其他对象则需要深拷贝。示例

res={a:{c:1},b:[2,3]}