2013-03-16 47 views
0

我在Ember中嵌套對象有很多(痛苦)的問題。我想我可能會以錯誤的方式處理事情,因爲我懷疑這是一個相當標準的事情。假設我有一個對象A「有很多」B,而每個B「有很多」C等(這種架構基本上與我的關係數據庫模式相匹配)。Ember JS:嵌套對象和體系結構

我不需要這些嵌套路由,所以我認爲自然的方式來呈現像A這樣的對象就是使用partials。喜歡的東西:

模板進行:

...A stuff... 
{{#each Bs}} 
    {{ partial "show_B" }} 
{{/each}} 

等。

問題是我想讓子對象擁有自己的控制器。我知道自RC1以來有新的itemController(http://emberjs.com/blog/2013/02/15/ember-1-0-rc.html),這很有用,但有所限制。比方說,在層次結構中,C對象每個都有一個D對象。所以C++模板應該是這樣的:

... C stuff... 
{{#with c.D}} 
    {{ partial "show_D" }} // How do I get this partial to have its own controller? 
{{/with}} 

我猜新{{control}}可以幫助在這裏,但我使用它有很多的麻煩(沒有被正確設定上下文)。另外,在我看來,它是否剛剛被添加(並且仍在開發中),這可能意味着應該有另一種方式來實現這一點。最後,使用兩個不同的API感覺有點奇怪:「itemController」用於項目列表,「{{control}}」用於單個項目 - 在一天結束時,我只是試圖將對象綁定到控制器在這兩種情況。

有人能指出我在這裏向正確的方向?

謝謝!

PJ

回答

0

我相信你已經朝着正確的方向發展。您需要使用control。我想這就是它被添加的原因。

在我看來,那itemControllercontrol之間的不同之處在於itemController不需要相應的視圖/模板所以你仍然會在同一視圖和模板繼續在線,而在control你需要一個單獨的視圖和模板。

如果control一個或itemController是贏,我認爲這將是control,因爲它目前在這兩種情況下(數組和單個對象)的作品,可以取代目前itemController。如果你曾經使用control{{#each Bs}},而不是itemController

注意,你需要定義,而不是partial控制器,視圖和模板(或只是讓Ember.js生成它們)。

像這樣:

{{#each Bs}} 
    {{control "showB" this}} 
{{/each}} 

而對於d:

{{control "showD" D}} 

但我同意你的看法,control仍然是越野車,和itemController是如此的相似control,它不會使感覺有兩個。兩者都比較新,所以我認爲這就是爲什麼你會遇到困難。但是,這對於github上或討論discuss.ember.js.com

一個荒謬的解決辦法是讓一個由含d陣列的計算性能和使用each dArrayitemController :)但是它顯然不如儘量使control爲你工作。

最壞的情況下,使用{{view}}幫手,並在視圖中放置一些邏輯,使其充當控制器(儘管這不是建議)。

+0

非常感謝泰迪。一個問題是把'{{control}}'放在每個塊中,現在並沒有真正的工作。請參閱此處:https://github.com/emberjs/ember.js/issues/1990。它造成了很多問題。您需要手動將相應的控制器註冊爲單例 - 這對我來說就像是一種黑客攻擊。所以實際上,現在itemController和'{{control}}'在集合上有不同的行爲......這讓我覺得整個事情更加奇怪。 – PJC 2013-03-16 16:36:01

+0

請注意解決方法是將其註冊爲**不是**單身人士。誠然,這是一個黑客,這就是爲什麼'控制'仍然隱藏在一個標誌後面:(但是,如果你得到它的工作,它就像'itemController'一樣。 – 2013-03-16 16:48:36

+0

這個線程可能對看起來這樣的人有所幫助:http ://discuss.emberjs.com/t/control-vs-itemcontroller/493/10 – sandstrom 2013-05-06 11:42:08