我想知道是否可以订阅更改对象,即数组。我的用例如下:用户重新加载页面,需要加载整个集合,然后获取一个具有特定id的对象。据我所知,我可以创建一个这样的函数:
在构造函数中:
this.getById(id);
功能
getById(id: string){
this.object = this.objectsService.getById(id);
if (this.object.name){ //check if object exist
//Do something
} else {
setTimeout(()=>{
this.getById(id)
}, 1000);
}
}
然而,我觉得这不是最好的事情。所以,我想做的是这样的事情:
let objects = this.objectService.getObjects() // returns object that will hold the collection;
objects.subscribe((value) => {
if(value.length) {
//Do something
}
});
答案 0 :(得分:4)
如果我正确理解您的问题,您是否希望从数组中创建一个observable,以便您可以订阅它?如果是这样,您可能正在寻找Rx.Observable.from(iterable, [mapFn], [thisArgs],[scheduler]
。 rxjs docs中有一个关于此的页面。
它从一个Array创建一个observable,然后你可以订阅它。
这样的事情可能就是你要找的东西
Rx.Observable.from([1,2,3]).subscribe(x => // do something with x);
正如评论中所指出的,上述方法订阅数组并观察当前在数组中的值,但它不处理对此数组的更改。
这里的方法可能是创建一个主题,然后观察主题。您可以将值推送到Subject(它基本上包含元素数组),而不是将值推送到现有数组。当您按下主题时,您将生成一个可由订阅者捕获的事件。
答案 1 :(得分:2)
您可以存储对数据数组的引用,而不是可观察。例如,当来自http服务的呼叫以可观察返回时,您可以执行
function getObjects:Promise<Item[]>{
return this.http.get(this.apiUrl)
.toPromise()
.then(this.extractData)
}
private extractData(res: Response) {
let body = res.json();
return body.data || { };
}
在您的组件类中,您可以存储如下数据:
this.objectService.getObjects().then(items=> this.items = items);
接下来,当您需要通过 id 获取项目时,您可以执行以下操作:
let currentItem = this.items.filter(x=> x.id == currentId)
通过这种方式,您可以在页面加载时缓存列表,并在用户的选择发生更改时准备好值。