1

我正在使用 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;
    }
}
4

2 回答 2

2

更新:该错误似乎已修复

我认为这个问题与angular2-meteor有关。

sort最后,当您尝试从 Mongo 获取数据时,我找到了一种使用 in 的工作方式。所以不再使用排序管道。

但是不能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);
}
于 2016-03-02T19:15:33.460 回答
0

我不知道调用背后的确切内容Meteor.users.find()usersCursor.fetch()但我认为您的用户的检索应该在过滤器本身之外完成。我猜一部分是在过滤器中完成的(使用usersCursor.fetch()?),这可能是问题所在......

于 2016-02-15T08:49:17.810 回答