2016-09-01 7 views
0

このメテオコードは、ブラウザのmongoコレクションCarsColからのデータを表示できません。
何が間違っていますか?おかげMeteorからコレクションへのコンポーネントのエクスポート

// /imports/api/collections.js 
export const CarsCol = new Mongo.Collection('carsCol'); 


// /imports/ui/myList.jsx 
import React from 'react'; 

export const ListItems = ({listItems}) => { //<---- {listItems} undefined 
    if (listItems && listItems.length > 0) { 
    return (
     <ol> 
     {listItems.map((item) => (
      <li key={item._id}>{item.car}</li> 
     ))} 
     </ol> 
    ); 
    } else { 
    return (
     <p>No cars yet!</p> //<------------ shows in browser 
    ); 
    } 
}; 


// /client/cars.js 
import React from 'react'; 
import ReactDOM from 'react-dom'; 
import { composeWithTracker } from 'react-komposer'; 
import { ListItems } from '../imports/ui/myList.jsx'; 
import { CarsCol } from '../imports/api/collections.js'; 

const composer = (props, onData) => { 
    const sub = Meteor.subscribe('carsCol'); 
    if (sub.ready()) { 
    const cars = CarsCol.find().fetch(); 
    onData(null, {cars}); 
    } 
}; 

const Container = composeWithTracker(composer) (ListItems); 
ReactDOM.render(<Container />, document.getElementById('react-root')); 

enter image description here

答えて

0

非常に身近な問題。このように、コンポーネントに小道具を経由しての代わりにフェッチされたデータのコレクションへの参照を渡すようにしてください:

// /imports/api/collections.js 
export const CarsCol = new Mongo.Collection('carsCol'); 


// /imports/ui/myList.jsx 
import React from 'react'; 

export const ListItems = ({cars}) => { 
    const listItems = cars.find().fetch(); // <- fetching data from a collection received as a prop right here 

    if (listItems && listItems.length > 0) { 
    return (
     <ol> 
     {listItems.map((item) => (
      <li key={item._id}>{item.car}</li> 
     ))} 
     </ol> 
    ); 
    } else { 
    return (
     <p>No cars yet!</p> //<------------ shows in browser 
    ); 
    } 
}; 


// /client/cars.js 
import React from 'react'; 
import ReactDOM from 'react-dom'; 
import { composeWithTracker } from 'react-komposer'; 
import { ListItems } from '../imports/ui/myList.jsx'; 
import { CarsCol } from '../imports/api/collections.js'; 

const composer = (props, onData) => { 
    const sub = Meteor.subscribe('carsCol'); 
    if (sub.ready()) { 
    onData(null, { 
     cars: CarsCol // <- now the "cars" prop is the collection 
    }); 
    } 
}; 

const Container = composeWithTracker(composer) (ListItems); 
ReactDOM.render(<Container />, document.getElementById('react-root')); 

私はそれが動作するはずと信じて、私はあなたがコードの100%を共有していなかったという強い気持ちを持っていますが、関与する。しかし、うまくいけば、サブスクリプションが準備ができたら、それから取り出されたデータではなくコレクション自体を渡し、小道具を介して渡し、コンポーネント自体の内部でフェッチを実行してください。このようにして、反応性も保持します。コレクションが更新されると、コンポーネントが更新(レンダリング)されます。

+0

コレクションからすべてのレコードを削除しましたが、ブラウザに何も表示されず更新されませんでした。この場合、なぜ反応性が働いていないのですか? –

+0

それは良い質問です、私はこれまであなたが記述する方法で動作していないことを見ていない。私は、[tracker-component](https://github.com/studiointeract/tracker-component)を使うとコードを大幅に変更する必要がありますが、問題を解決できると思います。 –

+0

反応のコンポジション反応がコンテナ内部で行われ、関数 'compose'の中でどのように反応するのか、mongoコレクションの変更に対応する方法を学びました。 ? [https://voice.kadira.io/using-meteor-data-and-react-with-meteor-1-3-13cb0935dedb#.bz29237uj] –

関連する問題