我对angular和rxjs很新 . 我正在尝试创建一个angular2应用程序,从静态服务的文本文件(在服务器上本地)获取一些数据,我想检索并在固定时间 interval(5000)
使用Angular2 's http provider and rxjs'映射映射到Datamodel . 反映对服务的txt文件的任何更改 .
使用rxjs 4.x我知道你可以使用 Observable.interval(5000)
来完成这项工作,但它似乎不存在于rxjs 5中 . 我的解决方法当前使用 <meta http-equiv="refresh" content="5" >
刷新整个应用程序,它重新加载整个页面,从而重新加载数据 .
所以我真正想要的是使用observable进行此操作的一些方法,也许是为了检查是否发生了任何更改 . 或者只是重新加载数据 .
任何帮助或其他/更好的方式将非常感谢 .
到目前为止我所拥有的:
@Injectable()
export class DataService {
constructor(private http:Http){}
getData(url) {
return this.http.get(url)
.map(res => {
return res.text();
})
.map(res => {
return res.split("\n");
})
.map(res => {
var dataModels: DataModel[] = [];
res.forEach(str => {
var s = str.split(",");
if(s[0] !== "") {
dataModels.push(new DataModel(s[0], parseInt(s[1]), parseInt(s[2])));
}
});
return dataModels;
})
}
}
@Component({
selector: 'my-app',
template: `Some html to display the data`,
providers: [DataService],
export class AppComponent {
data:DataModel[];
constructor(dataService:DataService) {}
ngOnInit() {
this.dataService.getData('url').subscribe(
res => {
this.data= res;
},
err => console.log(err),
() => console.log("Data received")
);
}
}
依赖关系:package.json
"dependencies": {
"angular2": "^2.0.0-beta.3",
"bootstrap": "^4.0.0-alpha.2",
"es6-promise": "^3.0.2",
"es6-shim": "^0.33.13",
"jquery": "^2.2.0",
"reflect-metadata": "^0.1.2",
"rxjs": "^5.0.0-beta.0",
"systemjs": "^0.19.20",
"zone.js": "^0.5.11"
},
"devDependencies": {
"typescript": "^1.7.5"
}
index.html导入:
<script src="node_modules/es6-shim/es6-shim.min.js"></script>
<script src="node_modules/systemjs/dist/system-polyfills.js"></script>
<script src="node_modules/angular2/bundles/angular2-polyfills.js"></script>
<script src="node_modules/systemjs/dist/system.src.js"></script>
<script src="node_modules/rxjs/bundles/Rx.js"></script>
<script src="node_modules/angular2/bundles/angular2.dev.js"></script>
<script src="node_modules/angular2/bundles/router.dev.js"></script>
<script src="node_modules/angular2/bundles/http.dev.js"></script>
4 回答
正如@Adam和@Ploppy所提到的,现在不推荐使用Observable.interval(),而不是创建这样的observable的首选方法 . 执行此操作的首选方法是通过IntervalObservable或TimerObservable . [目前在Typscript 2.5.2,rxjs 5.4.3,Angular 4.0.0]
我想在这个答案中添加一些用法,以证明我在Angular 2框架中找到了最好的方法 .
首先是你的服务(通过'ng g service MyExample“命令在angular cli中创建) . 假设服务是RESTful(http get request返回一个json):
我-example.service.ts
***查看Angular 5 ***服务的最新更新
现在你的组件代码('ng g component MyExample'):
我-example.component.ts:
===编辑===
更新了组件ts代码以通过TimerObservable合并订阅:
===编辑===
my-example-service.ts(使用HttpClient和Angular 5):
注意改变使用HttpClient而不是Http(在angular5中不推荐使用)和get方法,它允许将响应解析到我们的数据模型中,而不必使用rxjs .map()运算符 . 当角度5的服务改变时,组件代码保持不变 .
您可以在Angular2中使用
Observable
的interval
方法 .这是相应的plunkr描述:https://plnkr.co/edit/pVMEbbGSzMwSBS4XEXJI?p=preview .
基于此,您可以插入HTTP请求:
由于最近rxjs / observable的更改,我认为这个答案不再有效你现在必须使用IntervalObservable .
https://github.com/ReactiveX/rxjs/blob/master/src/observable/IntervalObservable.ts
对于TypeScript(答案时为1.8.10)/ angular2(答案时为rc1)和rxjs@5.0.0(答案时为beta.6),您需要使用扩展
Observable
类的IntervalObservable