0

まず、Meteor自体は使用せず、Angular-Meteorを使用しているので、原則は同じです。私がする必要があるのは、リソースが有効であるかどうかを確認し、その結果に基づいて決定を下すときに、helperの機能で検証します。meteor helperでクエリ結果を検証し、404にリダイレクトする方法は?

私はfindfindOneのコレクションの機能はクライアント側で同期していると思っていましたが、そうでないか、間違った方法でやっているようです。

私は、次のコードを持っている:

this.helpers({ 
     post() { 
     let _post = Posts.findOne({ 
      _id: this.postId 
     }); 

     if(typeof _post == 'undefined') 
      return this.$state.go('404'); 

     return _post; 
     } 
    }); 

this.postIdは、URLのparamsから来ています。私がアプリをナビゲートしているとき、すべての仕事。しかし、ページを更新するときにthis.postIdが定義されていますが、Posts.find()undefinedを返し、明らかに404ページに移動します。

¿このシナリオでは、どうすれば回避できますか?

答えて

1

これは、ページを更新すると、データがクライアントに送信される前にビューがレンダリングされるためです。これを回避するには、データが存在するかどうかを確認する前に、そのデータが準備が整っていることを確認する必要があります。言い換えれば、それはあなたのサブスクリプションの準備ができている場合は、チェックデモンストレーションとして、このコードを使用することを意味します

const handle = Meteor.subscribe('data'); 

if (handle.ready()) { 
    const post = Posts.findOne(/**/); 

    if (typeof post === 'undefined') { 
    console.log('post does not exist'); 
    } 
} 
+0

これは正しい答えです。ヘルパーコードをhandle.ready()にラップすると、常にデータが準備されていることを確認できます。ありがとうございました。 – Brian

0

@Khangは、データの準備ができる前にレンダリングされているビューに関する正しいです。

これを実行する別の方法は、使用する反応性変数を使用することですthis.getReactively()

これはあなたのヘルパーがどのように見えるかです:

this.helpers({ 
    post() { 
    let _post = Posts.findOne({ 
     _id: this.getReactively('postId') 
    }); 

    if(typeof _post == 'undefined') 
     return this.$state.go('404'); 

    return _post; 
    } 
}); 

ヘルパーを最初に実行し、データの前に、すなわち何も(返さないだろう

ちょうどgetReactively()はしませんそれ以外の場合は、あなたのコンストラクタでthis.postIdを宣言することを忘れないでください($state.go('404')をしない)あなたのコードは、通常のケースとしてこれを処理する必要がありますので、)準備ができています仕事。

+0

問題はthis.postIdが常に定義されているためではありません。 This.postIdはURL状態のパラメータから来ます。 – Brian

+0

それは常に定義されている場合はそれが良いです。 getReactivelyを使うと、Meteorは 'this.postId'にウォッチを置くようにします。つまり、ヘルパーは変更時に自動的に実行されます。それ以外の場合は、ユーザーが新しい投稿を選択したときに自分で行う必要があります – Mikkel

関連する問題