我有这段代码:
objs = []
getObjs() {
let counter = 0
this.myService.getObjs()
.map((obj) => {
counter = counter > 5 ? 0 : counter;
obj.col = counter;
counter++;
return view
})
.subscribe((obj) => {
console.log(obj);
this.objs = obj;
// I tried this too :
// this.zone.run(() => {
// this.objs.push(obj);
// });
}
, (err)=> console.warn('error in stream', err));
}
this.myService.getObjs是一个侦听SSE事件的流。这是代码,以防它有用:
getObjs(){
var es = new EventSource(this.API + '/stream');
return Observable.create((observer: any) => {
es.onmessage = (event) => {
let msg = JSON.parse(event.data)[0];
if(msg === "complete"){
console.log("received 'complete' signal from server");
es.close();
observer.complete();
}
observer.next(msg);
};
});
}
我在ngOnInit中调用此方法。然后我希望模板在事件到达时立即更新。模板:
<div class="col-md-2">
<thumbnail-dirictive [v]="view" *ngFor="let obj of ( objs | column: 0 )"></orbit-thumbnail>
</div>
现在,这会按预期记录。流事件到达并记录。没有发生的事情是模板没有按顺序更新,即:先到先得。
我知道我可以将流作为命名变量传递,并且在模板中使用异步管道,我也尝试传递toArray()方法并在它们全部到达后获取所有值(我在整个回调中得到的结果)观察者),我也试过减少到一个数组缓冲区,其中objs连接到最后但没有更幸运... 任何人都可以将一个不及时的流的工作示例发布到ngFor?
编辑1(说明角度版本): package.js:
{
"dependencies": {
"@angular/common": "2.0.0",
"@angular/compiler": "2.0.0",
"@angular/core": "2.0.0",
"@angular/forms": "2.0.0",
"@angular/http": "2.0.0",
"@angular/platform-browser": "2.0.0",
"@angular/platform-browser-dynamic": "2.0.0",
"@angular/router": "3.0.0",
"@angular/router-deprecated": "2.0.0-rc.2",
"@angular/upgrade": "2.0.0"
}
}
编辑2(列管道代码,在app模块中注册):
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({name: 'column'})
export class columnPipe implements PipeTransform {
transform(views, col: number): Array {
return views.filter((view) => {
return view.col === col;
});
}
}
答案 0 :(得分:0)
据我所知,你的代码看起来很好。如果this.objs = obj;
分配了正确的值,我就会开始寻找其他地方:
ngOnInit
。但是,如果您没有使用Component的ChangeDetectorRef
。
转储objs
,然后转发objs|column:0
:
<div class="col-md-2">
{{ objs|json }}
{{ objs|column:0|json }}
<thumbnail-dirictive ... />
确保它包含您的想法以及column
管道应该做什么(如果不了解数据结构,很难判断它是否正常工作)。
在您的模板中,您有:
<div class="col-md-2">
<thumbnail-dirictive ...></orbit-thumbnail>
这显然是不正确的。你确定问题不在这里吗?
如果这些都没有帮助,请尝试制作jsfiddle的基本plnkr,我们可以看到它是如何失败的。