2016-10-14 10 views
0

Meteor jsアプリケーションでは非常に興味深い問題があります。テンプレートのonCreatedメソッド内で流星法を呼び出すと、そのメソッド呼び出しのコールバックが結果。これは、流星法のシミュレーションを実行した結果テンプレートが作成されたためです。流星法シミュレーション以外でコードを実行する方法

つの質問:

  1. される。これはバグでしょうか?それは確かに私が期待した行動ではありません。
  2. setTimeoutのような奇妙なハックを使わずに、どうすればこの問題を回避できますか?(方法のシミュレーションではMeteor.setTimeoutは許可されていません)

いくつかのコード:

// My Template (Not my real code, just to demonstrate) 
Template.saying.onCreated(() => { 
    var tmpl = Template.instance(); 
    tmpl.saying = new ReactiveVar(); 

    Meteor.call('getSaying', (err, saying) => { 
    // If called inside of a simulation, saying is null 
    tmpl.saying.set(saying); 
    }); 
}); 


// Assume that the above template is used in an {{each}} block 
// and somewhere in my code I call this 
Items.insert({}); 

// Because Items.insert wraps a meteor method which also runs as a 
// simulation on the client, then the Template.saying.onCreated 
// callback will be called in the context of an active simulation, 
// which means that 'getSaying' method call will return immediately 
// with undefined as the result. 
+1

と評価されます反応変数を設定します。あなたがこの仕事をしても、それは遅くなるでしょう。なぜサーバーから取得したデータをコレクションに入れて、Meteorでクライアントにプッシュできるのでしょうか? –

+0

残念ながら、それは私が使用しなければならないパターンです、各テンプレートはそれ自身のトークンを必要とし、それらのトークンはその場で生成されなければなりません。 – cwohlman

答えて

0

2つの可能性のシミュレーションを回避するために:

  1. のみ
  2. 使用isClientファイルサーバ側でメソッドを定義します。あなたは、親テンプレートがちょうどにレンダリングされるたびにループ内で一度/テンプレートサーバーを呼び出すことになるだろう - シミュレーションが実行されると、それは、これはかなり非効率的なパターンのように感じている本当の

    if (Meteor.isClient) { 
    // on the client, the return value of a stub is ignored 
    return; 
    } 
    
+0

実際にはこれは2つの理由でうまくいきません。 1.私が得意なのは、サーバー側でしか定義されていないメソッドです(ただし、外部メソッドはクライアント側とサーバー側の両方に定義されています) 。 2.問題は、状況(シミュレーションの内部)で、戻り値が無視されないことですが、それが欲しいということです。 – cwohlman

+0

さて、上記のコードで値がどのように無視されているのかわかりません。あなたはどうしたのですか?シミュレーションの場合は、条件が真であると評価されます – hlx

+0

流星メソッドが流星メソッドシミュレーション内で呼び出された場合、上の例のように未定義の戻り値が流星メソッドコールバックに渡されるという問題があります。 – cwohlman

関連する問題