2016-11-01 11 views
2

の再レンダリングをトリガではありませんそこに)それを表示します。利用可能なデータがない場合、単純な読み込みメッセージが表示されます。しかし、このスニペットがオンになっているページを最初に読み込むと、読み込み部分にはまってしまいます。ページをリロードすると、データが表示されます(通常)。流星handle.ready()(レンダリングでは)私は私のrenderメソッドで次のコードを持っているコンポーネント

ページが最初にロードされ、ディスプレイが「ローディングヘラで」止まっている間にspatulaReady.ready()をチェックし、そこにあるべきデータがあれば、ハンドルはレディとして準備完了となり、データはそこにありますそうなっている。ページをリフレッシュすると、すべて表示されます。問題は、データとレンダリングがこのようになっているかどうかをチェックするこの方法が、過去に私にとってうまくいきました。それはレンダリングメソッドが反応しないためですか? handle.ready()はリアクティブである必要があるためです。それも奇妙になり何

はそれが時々正しく一見ランダムに、ページのロード時にデータを表示しないことです。

CreateContainerコード:

export default createContainer(props => { 
    return { 
     user: Meteor.user(), 
     spatulaReady: Meteor.subscribe('spatula.byId', props.deviceId), 
     spatula: SpatulaCollection.findOne() 
    } 
}, SpatulaConfig) 

公報コード:

Meteor.publish('spatula.byId', function(deviceId) { 
    const ERROR_MESSAGE = 'Error while obtaining spatula by id' 

    if (!this.userId) //Check for login 
     throw new Meteor.Error('Subscription denied!') 
    const spatula = SpatulaCollection.findOne({_id: deviceId}) 
    if(!spatula) //No spatula by this id 
     throw new Meteor.Error(403, ERROR_MESSAGE) 
    if(spatula.ownedBy != this.userId) //Spatula does not belong to this user 
     throw new Meteor.Error(403, ERROR_MESSAGE) 

    return SpatulaCollection.find({_id: deviceId}) 

}) 

私はここにパズルの一片を欠けている知っているが、私はそれを見つけることに成功してきました。私の特定の問題に対する解決策がわからない場合、データを表示する前にデータが到着するのを待つ別の方法で私を正しい方向に向けることも大いに感謝します。

編集:いくつかの試行錯誤をして、私のプロジェクトに多少関連の様々な他の記事を読んだ後、私は解決策を考え出した:

export default createContainer(props => { 
    const sHandle= Meteor.subscribe('spatula.byId', props.deviceId) 
    return { 
     user: Meteor.user(), 
     spatulaReady: sHandle.ready(), 
     spatula: SpatulaCollection.findOne() 
    } 
}, SpatulaConfig) 

それはまだ準備ができて移動することを、私には意味がありません( )コールコンテナを作成するすべての私の問題を修正しかし。

+0

'.ready()'コールをコンテナに入れてみてください。私はそれが反応性に関係していると信じています。 – MasterAM

答えて

1

あなたはcreateContainer修正問題に.ready()コールを動かす、考え出したよう。あなたは、このようなTracker.autoruncreateContainerなど反応性のデータソース(反応性機能)、反応コンテキスト内などcollection.find()subscriptionHandle.ready()を呼び出すときに流星の反応性がのみ動作するためです。 render含むリアクトコンポーネント内の関数は、流星の視点からない反応性の状況です。

リアクト注意と流星の反応性は別物です。いつでも、コンポーネントのpropsまたはstate変更、それはrender機能が再実行されますように反応するの反応性は、単純に動作します。 Meteorの反応性データソースについては何も理解していません。単に基礎となるコンポーネントに小道具を渡す(つまり流星それに反応性のデータソースが変更反応によって再実行される)createContainerので、成分は小道具がcreateContainer変化から与えられたときに反応させて再レンダリングされます。

+0

ありがとう、この説明は混乱をクリア! –

関連する問題