2016-08-04 12 views
1

時々、ページが再ロードされない限り永続的な変数が必要です。多くのEmberのコンベンションではオブジェクトが拡張されているので、私はprivate変数をどこに置いてパブリック関数からアクセスできるかわかりません。Ember RESTAdapterに永続変数を格納する適切な方法

これはextend() edオブジェクトに入れても明らかですが、Emberがその関数の親オブジェクトをbind()していないため、同じオブジェクト内の関数内から変数に到達できません。

shouldReloadRecord: function(store, snapArray) { 

    window.recordHashStore = window.recordHashStore || []; 
    let recordHash = `${snapArray.modelName}/${snapArray.id}?include=${snapArray.include}`; 
    if (!~window.recordHashStore.indexOf(recordHash)) { 
     window.recordHashStore.push(recordHash); 
     console.log('Reloading', snapArray.type); 
     return true; 
    } 
    else { 
     console.log('NOT reloading', snapArray.type); 
     return false; 
    } 
} 

ここに関連するコードがwindow.recordHashStore = window.recordHashStore || []です:私のRESTAdapterを前に、要求されたレコードをリロードする必要がある場合、私は控除することができるよう

は、ここで私は配列を格納する方法の例です。これはまさに私が望むものですが、Ember'yのようには見えません。また、windowグローバルスコープを使用するのは良いことではありません。ブラウザでアプリケーションの期間中プライベート変数を保存することができます。そのため、利用可能で、移行時に上書きされません。

+0

なぜここで配列を使用していますか?オブジェクトを使用するとコードが少なくなり、O(n)ではなくO(1)になります。たとえそれが簡単であっても、データ用のサービスを使用しています。 –

+0

@PatrickFisherこれは、私がDSストア内のレコードとしてキャッシュを追加することを考えていたので、気になる迅速な解決策です。しかし、それは質問には関係ありません。 – Redsandro

答えて

4

これは、Ember.Serviceの良いユースケースのようです。サービスは基本的にシングルトンですが、window /グローバルスコープでは公開されません。また、ルート遷移の影響を受けません(ルート遷移時にサービスを操作するコードがない限り)。

サービスをRESTAdapterに挿入し、サービスに状態を格納することができます。

+0

Upvoted。 1つの配列のサービスは少し多いようです。このようなグローバルな機能はありませんか? (私はこれを完全に作った): 'DS.store.addToSet( 'recordHashStore'、recordHash)' – Redsandro

+1

@Redsandroはありませんが、Storeを拡張することでそれらのメソッドを追加することができます。 (明らかにストアはEmber.Serviceも拡張しています!)例については、この回答を見てください:http://stackoverflow.com/a/34999549/1112407 –

+1

それは単にホストのURLのような変数なら、 App.jsのようにApp.variable = value;どこにでもインポートできますが、大量には使用しないでください –

関連する問題