2015-02-23 29 views
0

這可能聽起來像一個迂腐的問題。對不起:)EmberJS中「持久狀態」的定義範圍是什麼?

我有這樣的情況下......這是我的路由器定義:

Router.map(function() { 
    this.resource('gobernadores', { path: '/gobernadores' }, function() { 
    this.resource('gobernador', { path: '/:id_estado' }, function() { 
     this.route('simulacion', { path: '/simulacion' }), 
     this.route('info', { path: '/info' }) 
    }) 
    }); 
    this.route("login"); 
    this.route("bienvenido"); 
}); 

在「gobernadores」的路線,我有各省的名單。你可以看到它是一個嵌套的佈局。在同一頁面中,我們展示了當前選定的省份(這是gobernador路線)。在那個gobernador路線的模板裏,我有一個標籤,包含兩個元素......,一個顯示路線「simulacion」,另一個顯示路線「info」(該省)的模板。

現在,問題:當用戶從一個省跳到另一個省(通過點擊屏幕左側的導航菜單),我想保留在內存中,每個省都選擇當前選項卡。

因此,如果用戶目前正在看到省X的模擬結果,然後他點擊鏈接到Y省(他將在Y省顯示「信息」),然後他回到X省,我想讓應用程序將用戶帶回到他所看到的屏幕(X省的模擬)。

您不能將該信息存儲在控制器(GobernadorController)中,因爲我可以看到控制器無法保持狀態,它是無狀態的。

所以......,我要這些信息進入途徑(GobernadorRouteModel)的模型......

我的疑問:是它好嗎?爲什麼我懷疑?由於這樣的:http://emberjs.com/guides/concepts/core-concepts/

它說:

模型

模型是存儲持久狀態的對象。模板 負責將模型顯示爲 HTML。在很多應用程序中,模型都是通過HTTP JSON API加載的, 雖然Ember不知道您選擇的後端。

ROUTE

路由是一個對象,它告訴模板哪個模型它應該 顯示。

這個GobernadorRouteModel不是我堅持在後端。我無意這樣做。那麼,我是否違反了一個好的EmberJS應用程序的一般建議?

換句話說:「持久性」在這裏並不一定意味着「你保存到DB中的東西」,對吧?這只是「你想要保留的東西......,只是在應用程序會話期間,在內存中」。

由於提前, 拉嘎

回答

0

你不能存儲在控制器(GobernadorController)的信息,因爲我可以看到,控制器不能保持狀態,它是無狀態的。

這可能是您的問題出現的地方。控制器是而不是無狀態。 Ember中的控制器是單身人士,並在應用程序的整個生命週期中保持其狀態。但是,這將在Ember 2.0中發生變化。引用該RFC:

持久狀態應存儲在路由對象中,並作爲初始屬性傳遞給可路由組件。

所以,如果你想要向前兼容,那是我會採取的方法。在我看來,模型應該只用於持久狀態(持久性意味着它在頁面加載之間持久)。爲了保持會話狀態,我會按照RFC的說法進行操作,並在路由中保持該狀態,並在resetController掛鉤期間將其注入控制器。

或者,如果你不想成爲那樣的人,你不關心向前兼容性,只需要一個全局的Session對象來存儲狀態。這就是我現在這樣做的原理,它工作得很好。 (雖然我們可能會離開它。)

TL; DR:不,我不認爲您使用模型來達到預期目的。

+0

噢,我明白了......而不是將「選定的選項卡」作爲路線模型的屬性,我應該將其作爲路線的直接屬性,對吧? – 2015-02-23 18:24:53

+0

或者......就像你說的那樣,映射(省 - > selectedTab)是該單身控制器的一個屬性。 – 2015-02-23 18:38:15

+0

是的,其中任何一個都可以。看起來Ember 2.0的做法是在路線上擁有該屬性,然後使用操作對其進行更改。 – GJK 2015-02-23 19:40:05