我正在使用angular2-meteor,我已经使用pure: false
。但管道有时会运行,有时不会运行。有关问题的详细信息,请参阅代码中的注释。
由于
<div *ngFor="#user of (users|orderByStatus)">
{{user.status.online}}
</div>
users:Mongo.Cursor<Meteor.User>;
ngOnInit()
{
this.subscribe('users', () => {
this.autorun(() => {
this.users = Meteor.users.find();
});
}, true);
}
import {Pipe} from 'angular2/core';
@Pipe({
name: 'orderByStatus',
pure: false
})
export class OrderByStatusPipe {
transform(usersCursor:Mongo.Cursor<Meteor.User>):Array<Meteor.User> {
console.log("OrderByStatusPipe runs");
// (1) If I only do these two lines, the change of other users' status can show on the screen immediately.
// let users = usersCursor.fetch();
// return users;
// (2) If sort users by status, the page sometimes updates, sometimes not when user status change.
// If not update automatically, I click that part of screen, it will update then.
let users:Array<Meteor.User> = usersCursor.fetch();
users.sort((a, b) => {
return (a.status.online === b.status.online) ? 0 : (a.status.online ? -1 : 1);
});
return users;
}
}
答案 0 :(得分:2)
更新:错误似乎是fixed。
我认为这个问题与angular2-meteor有关。
当你尝试从Mongo获取数据时,我发现了一种使用sort
的工作方式。所以不再使用排序管了。
但您不能将users:Mongo.Cursor<Meteor.User>
与* ngFor一起使用,首先需要fetch()
并使用Array<Meteor.User>
,否则当列表顺序发生变化时会显示此错误:
无法读取未定义的属性“状态”
但是该列表不会在UI中自动更新。所以你需要使用NgZone
。
所以最终的工作代码是这样的:
<div *ngFor="#user of users)">
{{user.status.online}}
</div>
users:Array<Meteor.User>; // here cannot use users:Mongo.Cursor<Meteor.User>
constructor(private _ngZone:NgZone) {}
ngOnInit()
{
this.subscribe('users', () => {
this.autorun(() => {
this._ngZone.run(() => {
this.users = Meteor.users.find().fetch();
});
});
}, true);
}
答案 1 :(得分:0)
我不确切知道调用Meteor.users.find()
和usersCursor.fetch()
背后的内容,但我认为用户的检索应该在过滤器本身之外完成。我想一部分是在过滤器中完成的(usersCursor.fetch()
?),这可能是问题...