在* ngFor中使用管道,页面有时会更新,有时不会更新

时间:2016-02-15 00:49:33

标签: meteor typescript angular angular2-meteor

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

2 个答案:

答案 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()?),这可能是问题...