Observable 角度2:观察数据子集中的变化
(我的问题涉及但涉及一次解析的数据,而我需要重复解析。) 我下载400个项目,并将其过滤为默认的20个。用户可以更改过滤器,从而更改显示给他们的20个结果。我应该使用服务来存储数据和应用过滤器,还是应该在父组件中处理这些?如果是前者(感觉更适合练习),我需要一些帮助来连接它。 我有以下服务定义,将下载数据:Observable 角度2:观察数据子集中的变化,observable,angular,Observable,Angular,(我的问题涉及但涉及一次解析的数据,而我需要重复解析。) 我下载400个项目,并将其过滤为默认的20个。用户可以更改过滤器,从而更改显示给他们的20个结果。我应该使用服务来存储数据和应用过滤器,还是应该在父组件中处理这些?如果是前者(感觉更适合练习),我需要一些帮助来连接它。 我有以下服务定义,将下载数据: @Injectable() export class RestosSvc { http: Http; data: { restos : Array<Re
@Injectable()
export class RestosSvc {
http: Http;
data: {
restos : Array<Resto>;
recommendations: Array<Resto>;
};
constructor(http:Http) {
console.log('RestosSvc constructor');
...
然后,我需要找到一种方法,在数据下载后,以及由于所用过滤器的更改而导致数据随后发生更改时,获取建议
刷新
问题:
应该直接与服务对话,还是由其自身与服务对话的父级提供事件处理程序过滤器
- 如何设置服务,以便在更新了
建议后,将此信息提供给
this.data.recommendations = ...
// this.$rootScope.$broadcast('recommendations');
而my home组件目前仅在引导时获得空建议(在下载restos
并应用默认过滤器之前)
导出类HomeCmp{
建议:阵列;
构造函数(restos:RestosSvc){
//ObservableWrapper.subscribe(
//restos.data.recommendations,
//recs=>this.recommendations=recs
// );
this.recommendations=restos.data.recommendations;
}
}
我不确定是否理解您的问题,但我猜答案是Angular 2有一个内置的observable-http将返回一个observable,而不是承诺!更多细节,请查看帖子。基本的想法是,你现在可以做这样的事情(参考摘自帖子):
反应式编程是在Angular 2中构建的,所以您不必为了使用它而做一些特殊的事情
希望这能回答你的问题。如果没有,请补充一些解释
编辑:
作为对上一次编辑的回应,我想最好使用单向树数据流(类似于React的方法)。这意味着数据/状态应该是不可变的,不应该被不拥有它的组件更改
我认为数据应该来自父组件,在用户交互时,过滤器组件应该触发一个事件到父组件,该事件将通知子组件有关更改(这是通过输入数据,使用[data]
语法)
我希望我正确理解了你的问题 好的,所以我通过改编@EricMartinez plnkr解决了这个问题。基于his,但将更多的数据处理委托给服务
export class Hello {
original: [];
recommendations: [];
constructor(public svc: RestosSvc) {
}
downloadData() {
// Data coming from the server via service
this.svc.http
.subscribe((data) => {
this.original = data;
this.recommendations = this.original;
});
}
handleFilterChange(count) {
// Filter
console.log(count);
this.recommendations = this.original.slice(0, count);
}
}
像这样的东西是你想要的吗?@EricMartinez就最终结果而言是的,但是你已经将数据处理放在父组件中了,而且就我所见,该服务实际上没有被使用。实际上,我的应用程序并不复杂,所以我也许也可以这样做,但它感觉不到“最佳实践”,我认为我不应该这样做。我希望过滤器中的一个事件被传递到服务中,引发一系列建议,然后再传递给父组件,以提供给map和listI。我还惊讶于你让Angular2、TS和SystemJS看起来如此简单——我自己完成了这项工作,并开始使用种子,但你却在使用你不理解的代码。我可能会把你的框架作为我前进的基础!如果您可以提供一些简化的示例(我发现从当前的代码示例中很难理解),那么理解问题/问题就会容易得多。10倍!好的,我明天可能会去使用@EricMartinez的模板,因为我现在太累了。是的,我可以看到如何在加载时获取数据,但是如何处理导致对完整数据进行不同过滤的用户事件,这需要重新呈现data@SimonH:请看我最后一次编辑。希望它能回答你的一些问题。
export class HomeCmp {
recommendations : Array<Resto>;
constructor(restos: RestosSvc) {
// ObservableWrapper.subscribe(
// restos.data.recommendations,
// recs => this.recommendations = recs
// );
this.recommendations = restos.data.recommendations;
}
}
getRandomQuote() {
this.http.get('http://localhost:3001/api/random-quote')
.map(res => res.text())
.subscribe(
data => this.randomQuote = data,
err => this.logError(err),
() => console.log('Random Quote Complete')
);
}
export class Hello {
original: [];
recommendations: [];
constructor(public svc: RestosSvc) {
}
downloadData() {
// Data coming from the server via service
this.svc.http
.subscribe((data) => {
this.original = data;
this.recommendations = this.original;
});
}
handleFilterChange(count) {
// Filter
console.log(count);
this.recommendations = this.original.slice(0, count);
}
}