2017-05-12 3 views
0

データの読み込み中にモーダルパッケージを使用してMeteorに読み込み警告を表示しようとしました。Meteor Collection.find()は作業中にアプリケーション全体をブロックします

'change .filterPieChart': function(evt){ 

    Modal.show('loadingModal'); 

    /* a little bit of work */ 
    var data = MyCollection.find().fetch(); // takes 3 or 4 seconds 
    /* lot of work */ 

    Modal.hide('loadingModal'); 
} 

通常、アラートは機能の最初に表示され、最後に消えます。しかし、ここでは、MyCollection.find()の読み込み時間後にアラートが表示され、その後は消えます。関数の先頭に表示する方法は?

私はModal.showを反応変数に置き換えようとしましたが、結果は同じです。反応変数の変化する値は関数の最後に検出されます。

答えて

0

あなたの説明から、JSエンジンは、(コレクションを検索して)計算を実行していて、他の反応変数がすでに検出されているかどうかにかかわらずUIをブロックしている可能性があります。

簡単な回避策は、UIは、一般的にsetTimeoutで、コレクションの検索(または他の集中的な計算を)遅らせることによって、あなたのモーダルを表示するにはある程度の時間を与えるために、次のようになります。

Modal.show('loadingModal'); 

setTimeout(function() { 
    /* a little bit of work */ 
    var data = MyCollection.find().fetch(); // takes 3 or 4 seconds 
    /* lot of work */ 

    Modal.hide('loadingModal'); 
}, 500); // delay in ms 

より複雑なアプローチができrequestAnimationFrame

+0

ありがとうございます。しかし、私の場合はどのようにrequestAnimationFrameを使用して理解していない。私はそれを呼び出すと思いますか? –

+0

MyCollection.find()で新しいスレッドを使用したり、コールバックでアラートを非表示にすることはできません。 –

+0

残念ながら、[_web workers_](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers)を使用しない限り、JSはシングルスレッド化されています。 'requestAnimationFrame'については、フルフレームがペイントされていることを確認するために、それを2回使用する必要があります。しかし、あなたのモーダル・ショーがアニメーションを使用していると、それが妨げられる可能性があるので、上記の答えに示されている修正遅延や、モーダルの表示が終了したイベントを使用する必要があります。 – ghybs

0

テンプレートレベルのsubscription + reactiveVarを使用する必要があると思います。それはもっと流星であり、あなたのコードは一貫して見えます。私が見る通り、changeイベントでいくつかの追加作業(いくつかのデータを取得)を行います。これをシミュレーションする代わりに、イベントのデータを実際に実際に検索するのが理にかなっています。

Template.TemplateName.onCreated(function() { 
    this.subsVar = new RelativeVar(); 
    this.autorun(() => { 
     let subsVar = this.subsVar.get(); 
     this.subscribe('publicationsName', this.subsVar);  
    }) 
    }) 

    Template.TemplateName.events({ 
    'change .filterPieChart': function(evt){ 
     Template.instance().collectionDate.subsVar.set('value'); 
     Modal.show('loadingModal'); 

     MyCollection.find().fetch();  

     Modal.hide('loadingModal'); 
    } 
    }) 

私はこのコードをテストしなかったことに注意してください。そして、あなたはes6の矢印機能を使う必要があります。

関連する問題