2016-10-25 3 views
1

は今angular2 - 流星に我々は使用して私たちの見解にコレクションが変更に役立ちますMongo.Cursorとゾーン()メソッドの代わりにMongoObservable.Collectionを使用して開始しました私たちのコンポーネントのゾーンと| HTMLテンプレートのasyncここにはlatest tutorialはMeteor.users.find上のゾーンを()を使用する方法({})

のリンクがあります。新しいMetaor.users.find({})メソッドでこのゾーン()メソッドを使用して、新しいユーザーが正常に作成されたときに自動的にすべてのユーザーを表示しようとしています。クライアント側で私は

userlist: Observable<any[]>; 
userSData: Subscription; 
    ngOnInit() { 
      this.usersData = MeteorObservable.subscribe('userData').subscribe(() => { 
       this.userlist=Meteor.users.find({}).fetch(); 
      }); 

htmlコードを使用している

Meteor.publish("userData", function() { 
    if (Roles.userIsInRole(this.userId, 'admin')) { 
     return Meteor.users.find(); 
    } else { 
     const selector = { 
      '_id': this.userId 
     }; 
     return Meteor.users.find(selector); 
    } 
}); 

と私のサーバー側の

コードは私がに.zone()を適用する際に

<li class="list-item" *ngFor="let user of userlist"> 

ですこのthis.userlist = Meteor.users.find({}).zone();
このエラーが発生します。

TypeError: meteor_1.Meteor.users.find(...).zone is not a function 

私はzone()と| asyncを実行すると、すべてのユーザーリストが取得されますが、ユーザーを削除したり新しいユーザーを作成したりすると、リストが自動的に更新されず、更新する必要があります。新しいコンテンツを自動レンダリングするには、ゾーンと非同期を使用する必要がありますが、Meteor.users.find()では使用できません。

+0

私は流星に新しいと角度午前私はユーザーをリストアップしようとしています。しかし、this.userlist = Meteor.users.find({})。fetch();にエラーが発生しました。割り当てできません。それはあなたのために正しく働いていますか? –

+3

コレクションの宣言は次のようにする必要があります。 'export const Users = MongoObservable.fromExisting(Meteor.users);'このようにアクセスできます。this.usersData = MeteorObservable.subscribe( 'userData')。subscribe(()=> { this.userlist = Users。 find({})。zone(); }); ' –

+0

ありがとう!これは動作します! –

答えて

2

たぶんビューが更新されません... NgZoneを使用します(角度/コア@からインポート)し、このように、サブスクリプションでそれを使用しよう:

constructor(private ngZone: NgZone) {} 

ngOnInit() { 
    this.clientsSub = MeteorObservable.subscribe('myClients').subscribe(() => { 
     this.ngZone.run(() => { 
      this.clients = Clients.find({}, {sort: {name: 1}}); 
     }); 
    }); 
} 
+0

助けてくれてありがとう。今働いている –

+0

将来的に同じ問題を抱えている人には、正しい答えとしてマークすることを忘れないでください! :) – Jesper

+0

この解決策がクライアントのために余分な仕事を引き起こすようです。 実際には、クライアントが小さなレコードセットにしかアクセスできない場合は、目立つべきではありません。 余分な仕事はなぜですか?このコードでは、「サーバーがレコードセットの変更を認識するたびに、新しいカーソルを取得してローカルでコレクションをミラーリングするために使用するときはいつでも」と表示されているようです。しかし、新しいカーソルを取得する場合、サブスクライバはセット全体を再同期するしかありません。このような操作の価格は、レコードセットのサイズに比例します。 –

関連する問題