2016-08-04 38 views
1

有時,只要頁面未重新加載,您就需要一個持久變量。由於大量的Ember約定是擴展對象,我不確定在哪裏放置私有變量,以便它們可以從公共函數訪問。在Ember中存儲持久變量的正確方法RESTAdapter

似乎很明顯,只是把它放在extend() ed對象中,但是這個變量不能從同一個對象的函數內到達,可能是因爲Ember不是函數的父對象bind()

這裏是我如何存儲陣列的例子,這樣我可以扣除,如果我的RESTAdapter應該重新加載以前已經被請求的紀錄:

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 || []。這正是我想要的,但它看起來不像Ember'y。全球範圍使用window也不好。我可以在瀏覽器中將應用程序持續時間的私有變量存儲在哪裏,以便它在轉換時可用並且不會被覆蓋?

+0

你爲什麼在這裏使用數組?使用一個對象將會減少代碼和O(1)而不是O(n)。我第二次使用數據服務,即使它是微不足道的。 –

+0

@PatrickFisher這是一個想到的快速解決方案,因爲我正考慮在DS商店中將緩存添加爲記錄。儘管如此,這與問題無關。 – Redsandro

回答

4

這聽起來像是一個很好的用例Ember.Service。服務本質上是一個單身人士,但它並未在您的window /全球範圍內公開。它也不受路由轉換的影響(除非你有在路由轉換中操縱服務的代碼)。

您可以將服務注入到RESTAdapter中,並將狀態存儲在服務中。

+0

Upvoted。單個陣列的服務似乎有點多。沒有像這樣的全球性功能嗎? (我完全是這樣做的):'DS.store.addToSet('recordHashStore',recordHash)' – Redsandro

+1

@Redsandro沒有,但你可以嘗試通過擴展Store來添加這些方法。 (顯然這個商店也擴展了Ember.Service!)看到這個答案的一個例子:http://stackoverflow.com/a/34999549/1112407 –

+1

如果它只是一個變量,像一個主機url或者你可以簡單地定義在app.js中像App.variable = value;並將它導入到任何地方,但不要將其用於更大的金額 –