2016-09-19 58 views
0

讓我們先從一個常見的場景,你必須對模型的計算性能:Emberjs捉住22 - 父計算性質計算的hasMany相關對象

型號/ coney.js

bunniesTotal: Ember.computed.alias('babyBunnies.length') 

比方說入口點的應用程序是顯示索引頁的所有Coneys

routes/coneys/index 

的API返回所有Coneys但它的分頁,所以只有50出現每頁(很棒,我們不想太多的兔子跑來跑去嗎?)

隨着每個康尼(父母的兔子)來所有的孩子(因爲只有他們的幾個,他們只是littl'uns - 即。小有效載荷!)

因此,bunniesTotal將始終準確,您可以在coneys/index頁面上的每個Coney列表上看到它。偉大的,美妙的,你在Ember教程中看到的一個常見例子。 沉悶的善良。

更灰燼善良 - 用戶後訪問/coneys/new.js,並增加了一個新的Coney和一些BabyBunnies,用戶將自動看到上面bunniesTotal更新,當他們回來/coneyes/index,由於新BabyBunny在灰燼 商店 沃倫。水下降,來吧!

現在,讓我們前往未來並將我們的 數據 warren縮放。呃哦。

現在Coneys有成千上萬的兒童,也許數以千計的孫子太(是啊,兔子,去數字!)

它沒有任何意義,現在,在coneys/index頁面上,加載所有ALL的BabyBunnies首先擊中50個Coneys。不好。因此,我們修改API並刪除BabyBunnies,以便每個Coney都必須單獨請求它們(例如,例如,當您轉到coneys/edit時)。因此,讓我們修改API並刪除BabyBunnies,以便每個Coney都必須單獨請求它們(例如,當您轉到coneys/edit時)。

但是......你對計數做了什麼?現在客戶不知道每個家長可能有多少個孩子。

您可以在API中的每個父代中包含一個屬性,而不是在Ember中。所以,現在你計算服務器上的孩子,並將其發送給Ember。也許是meta.children_total或只是模型上的一個屬性。嗯不錯。

但現在當用戶在客戶端上添加一個子項時,總數不會自動更新。你已經損失了Ember善良並且你的索引頁在用戶眼中已經「退化」了。

用戶在添加新的「子」並重定向到coneys/index後,將看不到總更新。他們會認爲有些事情是錯的。發生了什麼新的 寶寶兔子 剛剛創建的孩子?

所以,在那個小時間旅行的文章之後,這裏是問題。

是否有一些Ember的方式來解決這個Catch-22?

也許在向其添加子項後,父級的後臺刷新。或者只是爲父母或其他一些Ember魔術請求元數據?

我看過ds-references和發生在該功能上的discussion,但都沒有幫助我看到該問題推薦的解決方案是/應該是什麼。


UPDATE


在這種DS-引用鏈接有這樣的說法:

檢索有關記錄或關係

服務器提供的元數據和這個代碼:

var meta = post.hasMany('comments').meta(); 
console.log(`${commentIds.length} comments out of ${meta.total}`); 

因此,這意味着答案是有一個由服務器提供的BabyBunnies(兒童)元總。 meta.total將會是所有孩子的總數。

但是,這會導致另外兩個問題:

  1. 當用戶添加了一個新的嬰兒,並將其保存到存儲/沃倫和 因此服務器,如何灰燼拿到新的總?它會做一些 背景魔術只檢索總數?我懷疑沒有,並且 ,我必須手動請求BabyBunny端點剛剛獲得 新的總和。

  2. 如果該元總實際上不是一個 '原' 總,但這:

    meta.totalFemaleBabyBunnies

    meta.totalMaleBabyBunnies

我怎麼沒看到灰燼可以更新此類總數而不會觸發BabyBunny終點的刷新(這意味着每次添加新寶貝時都會這樣做)

Ha你有這個問題嗎?如果是這樣,你做了什麼來解決它?

回答

0

我解決了這個問題,通過將男性/女性寶寶兔子的總數直接添加到父級的活動記錄序列化程序(即,因此它們是父級模型中的Ember中的屬性)。沒有單獨的元總數,也不需要使用ds引用。

我只想看看最簡單直接的解決方案是否會「正常工作」。

所以現在當一個新寶貝發佈到API中時,會自動重新計算男性/女性計數並將其作爲父負載的一部分發送回Ember。 Boom,coney/index頁面上的計數更新就像那樣!

工程就像一個魅力。

我使用1,500 BabyBunnies(使用Postgres)在本地蹩腳的五歲MacAir(Core i5 1.7GHz/4GB Ram)上測試了它。更新兩個計數僅爲頁面加載增加了大約1ms。因此,1/1/300眼睛:)

的眨眼的我永遠不會有1500 BabyBunnies,因此該方案較適合更多。