2017-01-12 14 views
1

私は流星アプリを持っており、以下のようなIron Routerの設定で一度にすべての公開関数を呼び出しています。私は、ユーザーがログインされた後、サブスクリプションを返すようにしたいので、私は)(Meteor.userIdを確認してください。Meteor:Publish関数はユーザーがログインした後にページを更新する必要があります

Router.configure({ 
    layoutTemplate: 'layout', 
    loadingTemplate: 'loading', 
    notFoundTemplate: '404', 
    waitOn: function() { 
    if (Meteor.userId()) { 
     return [Meteor.subscribe('users'), 
      Meteor.subscribe('company'), 
      Meteor.subscribe('projects'), 
      Meteor.subscribe('columns'), 
      Meteor.subscribe('cards'), 
      Meteor.subscribe('contents'), 
      Meteor.subscribe('labels'), 
      Meteor.subscribe('notifications')]; 
    } 
    } 
}); 

機能は次のようにuser.companyIdに依存するすべて同じ構造を持っている公開:

Meteor.publish('cards', function() { 
    if (this.userId) { 
    const user = Meteor.users.findOne({ _id: this.userId, companyId: { $exists: true } }); 

    if (user) { 
     return Cards.find({ companyId: user.companyId }); 
    } 
    } else { 
    this.ready(); 
    } 
}); 

私の問題は、ユーザー登録時にアカウントが作成され、companyIdがユーザーに保存されますが、ログインするときに表示される唯一の方法はブラウザを更新することです。私はそれを反応的にしたい。 meteor guideから

+0

あなたが公開-複合これを達成するために使用することができます。 – MasterAM

答えて

1

:反応性機能の変化でどちらかといえば

クライアントで、全体 機能が再実行され、その結果はかなり直感的です。

ただし、サーバー上では、公開機能から返されるカーソルの動作が の動作に制限されています。クエリに一致するデータには の変更が表示されますが、クエリ は決してを変更しません。

示唆したようにあなたは本当にreywood:publish-compositeを使用することができますが、あなたの単純なケースのために私はreactive-publishが起動して実行する方がはるかに簡単になると思います。

は、パッケージをインストールし、ちょうどthis.autorunにパブリケーションをラップ:

Meteor.publish('cards', function() { 
    this.autorun(function() { 
    if (this.userId) { 
     const user = Meteor.users.findOne({ _id: this.userId, companyId: { $exists: true } }); 

     if (user) { 
      return Cards.find({ companyId: user.companyId }); 
     } 
    } else { 
     this.ready(); 
    } 
    }); 
}); 
+0

また、あなたは 'else'ステートメントで' return'したいと思います – rubie

関連する問題