2016-12-19 2 views
5

登録されたすべてのユーザーをクライアント側に表示するのに問題があります。 std:accounts-uiパッケージは.meteor/packagesに含まれています。 autopublishパッケージが削除されました。クライアントはreact-meteor-dataによって提供さcreateContainer内からallUsersパブリケーションにサブスクライブしている間、すべてのユーザーのMeteor Reactクライアントのすべてのユーザーを表示

データは、allUsersとしてUsers.jsで公開されています。

しかしページは、現在ログインしているユーザーの詳細をレンダリングします。ブラウザーJSコンソールでMeteor.users().find().fetch()を実行すると、唯一の現在ログインしているユーザーを示し、かつユーザーがログインしていない場合は何も表示されません。

サーバー側のconsole.log(Meteor.users.find().fetch()を実行すると、すべてのユーザーが正しく出力されます。

なぜブラウザでこの現象が発生していますか?

/imports/api/Users.js

import { Meteor } from 'meteor/meteor'; 

if (Meteor.isServer) { 
    Meteor.publish('allUsers', function() { 
     return Meteor.users.find({}); 
    }) 
} 

/imports/ui/App.jsx

import React, { Component, PropTypes } from 'react'; 
import { createContainer } from 'meteor/react-meteor-data'; 
import { Accounts } from 'meteor/std:accounts-ui'; 
import { Table } from 'react-bootstrap'; 
import User from './User'; 


export class App extends Component { 

    renderUsers() { 
     return this.props.users.map((user) => (
      <User key={user._id} user={user} /> 
     )); 
    } 


    render() { 
     return (
      <div> 
       <h1>Users</h1> 

       <Table> 
        <tbody> 
         <tr> 
          <td>ID</td> 
          <td>Email</td> 
          <td>createdAt</td> 
         </tr> 

         { this.renderUsers() } 

        </tbody> 
       </Table> 
      </div> 
     ) 
    } 
} 

App.propTypes = { 
    users: PropTypes.array.isRequired 
} 

export default createContainer(() => { 
    Meteor.subscribe('allUsers'); 

    return { 
     users: Meteor.users.find().fetch() 
    } 
}, App); 

/imports/ui/User.jsx

import React, { Component } from 'react'; 

export default class Users extends Component { 
    render() { 
     return (
      <tr> 
       <td>{ this.props.user._id}</td> 
       <td>{ _.get(this.props, 'user.emails[0].address', 'UNKNOWN') }</td> 
       <td>{ this.props.user.createdAt }</td> 
      </tr> 
     ) 
    } 
} 
+1

Upvoteは複数の "are"データを使用します。 –

+0

@JonathanWheeler omgありがとうございました! :) – Nyxynyx

+0

Meteor.user()私は知っている組み込み関数です。すべてのユーザーに加入していない場合は、ここで説明している機能に引き続きアクセスできますか? –

答えて

2

私は角2と流星を使っていたときに同じ問題に直面していました。私はまた、Meteor.users.find({});

を使ってデータにアクセスしようとしましたが、これは正しい方法ではありません。最初にあなたが

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); 
     } 
    }); 

に、この

export const Users = MongoObservable.fromExisting(Meteor.users);<-- most important line 

のような新しいコレクションを作成し、それを購読することにより、あなたのファイルで使用する必要があり、これを使用するための 。

MeteorObservable.subscribe('userData').subscribe(() => { 
        this.userlist=Users.find({});  
      }); 

最後のサブスクリプションパートでは、角度2.you plzの反応構文を使用しました。

+0

私は 'meteor/meteor ';'と 'const Users = MongoObservable.fromExisting(Meteor.users);'から 'import {Meteor、MongoObservable}を試しましたが、' Uncaught TypeError:プロパティを読み込めません'というエラーが見つかりました。ブラウザコンソールに表示されます。 – Nyxynyx

+0

'MongoObservable'にアクセスするためにパッケージをインストールする必要はありますか? https://www.npmjs.com/package/meteor-rxjsやMeteorに組み込まれていますか? – Nyxynyx

+0

MongoObservableを使う必要はありません。反応流星では、既存のものからコレクションを作成する方法があるはずです。最初にexport constを使ってみてください。Tasks = new Mongo.Collection(Meteor.users);私は決して反応を使用しなかったので、正確に言うことはできませんが、何らかの方法があるはずです。 –

関連する問題