我想要 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 发出时发出一个数组。这里 model1
和 model2
应该具有相同的值。
注意:这将创建两个单独的请求。如果您想创建单个请求,请查看下面的上一个答案。
上一个答案
看这里
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
因为当我们声明 model1
和 model2
的值为 res
时,它们都指向同一个对象。两者都持有同一对象的引用(这里 res
)并且改变一个会改变另一个。
您需要做的是将 res
克隆到 model2
,这样它将是一个与 res
具有相同值的不同对象。克隆分浅层和深度两种。
- Efficient deep copy
- Shallow copy
- Difference between shallow and deep copy.
如果您的 res
对象值是字符串、数字等,那么您需要浅拷贝。示例
res= {a:1,b:"2"}
如果它们包含数组,其他对象则需要深拷贝。示例
res={a:{c:1},b:[2,3]}
好的,让我来解释一下。我正在从 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;
});
已更新
您可以像
一样使用 combineLatestlet 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 发出时发出一个数组。这里 model1
和 model2
应该具有相同的值。
注意:这将创建两个单独的请求。如果您想创建单个请求,请查看下面的上一个答案。
上一个答案
看这里
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
因为当我们声明 model1
和 model2
的值为 res
时,它们都指向同一个对象。两者都持有同一对象的引用(这里 res
)并且改变一个会改变另一个。
您需要做的是将 res
克隆到 model2
,这样它将是一个与 res
具有相同值的不同对象。克隆分浅层和深度两种。
- Efficient deep copy
- Shallow copy
- Difference between shallow and deep copy.
如果您的 res
对象值是字符串、数字等,那么您需要浅拷贝。示例
res= {a:1,b:"2"}
如果它们包含数组,其他对象则需要深拷贝。示例
res={a:{c:1},b:[2,3]}