2013-04-28 67 views
5

我設置一個狀態管理器用於跟蹤用戶的登錄狀態,基於這個答案在這裏:Change Navbar based on login state灰燼出口兩次改變狀態後,不會呈現

不過,我想它帶到下一步,不僅有根據狀態的導航欄更新,而且主要模板本身。我已經完成了這個工作,所以當你點擊登錄按鈕時,它會顯示'歡迎你現在登錄消息'。但是,如果您註銷並嘗試再次登錄,它只會顯示一個空白屏幕,就好像它不正確地重新渲染索引路線一樣。這是我的問題JSFiddle。注意當你點擊登錄/註銷然後再次登錄時會發生什麼。 「歡迎」消息不顯示。

這裏是我的索引模板:

{{render navbar}} 
     {{authState}} 
{{#if isAuthenticated}} 
    {{outlet}} 
{{else}} 
    {{render login}} 
{{/if}} 

我可以看到「authState」是正確的,但「出口」沒有呈現第二次我登錄...

這裏是完整的jsfiddle:

http://jsfiddle.net/Benmonro/HmJyu/1/

澄清

@ham要求澄清,所以這裏有雲:

我想在這裏完成的主要問題是,當一個國家經理變動的isAuthenticated那麼什麼是{{outlet}}目前呈現的狀態應該被交換出去在{{render login}}中呈現的內容可能真的是任何模板。重點是{{outlet}}將顯示和隱藏瓦特/狀態變化...

回答

2

它不工作的原因是因爲你有兩個DOM節點,編號爲index。在你的小提琴是額外的</script>在HTML窗格的末尾,但我猜沒關係。

DOM中的ID必須是唯一的,否則您可以看到一些像這樣的意外問題。你可以在這裏閱讀更多https://developer.mozilla.org/en/docs/DOM/element.id

這裏是工作的小提琴叉 - http://jsfiddle.net/wbednarski/eMcXq/

順便說一句,你可能會發現有用的,以及 - Difference between == and === in JavaScript

+0

實際上,這個解決方案仍然不能解決真正的問題,即{{outlet}}不會呈現兩次。我通過將'index'腳本重命名爲'welcome'來更新小提琴,並且您可以看到它仍顯示相同的行爲: http://jsfiddle.net/Benmonro/HmJyu/3/ 此外,如果我可以' t命名第二個腳本'索引'如何將該腳本定義爲路由中的默認路徑? – Ben 2013-05-01 04:08:10

+0

@你在DOM中仍然有一個以上的id,例如登錄...另一件事是你的狀態管理器與outlet渲染無關 - 它在你的navbar控制器中。我猜你可以刪除模板中的狀態管理員代碼和「if」,當你點擊登錄右上角時,你會看到歡迎信息。第二個問題:是的,你不能把模板稱爲索引是根據Ember命名約定。另一個更好的做法是將每個模板保存在單獨的文件中,而不是愚蠢的腳本標記,您可以註冊外部文件,如Ember.TEMPLATES [name] = Ember.Handlebars.compile(); – 2013-05-01 05:05:31

+0

感謝提示,我對Ember有點小事,我看到了我想切換到的ember-tools,但沒有時間。我剛剛離開指南和例子,肯定要利用Ember.TEMPLATES。 儘管如此,我通過並刪除了任何重複的ID,但問題仍然存在。我在這裏再次更新了JSFiddle。 http://jsfiddle.net/Benmonro/HmJyu/4/我希望以這種方式使插座工作的原因是,如果您在某個路線上註銷(例如,說/ posts/1/edit)那麼當你登錄時,你就會回到那裏。 – Ben 2013-05-01 06:43:51

2

你是不是轉出你的router的,但只改變你的狀態LoginStateManager。如果您在創建App時將路由輸出包含在內,您將看到輸出結果,並且沒有從「歡迎」狀態轉換出來。

只要改變App到:

應用= Ember.Application.create({LOG_TRANSITIONS:真});

您將看到使用的navBarlogin -button將再次執行正確的功能,其中login窗體上的按鈕不過渡狀態,爲此不顯示正確的結果。這是因爲您在App.NavBarController中執行this.transitionToRoute("welcome")

只需擴展所有登錄和退出: this.transitionToRoute("welcome")this.transitionToRoute("index")它的作用就像一個魅力。

在此處添加了一個示例小提琴:http://jsfiddle.net/AlphaEagle/rGNca/4/希望它有幫助! [/編輯]

+0

嗯,有趣。我更新了我的小提琴,但它仍然不起作用,你可以分叉,也許告訴我你的意思? http://jsfiddle.net/Benmonro/HmJyu/5/ 此外,我爲transitionToRoute(「welcome」)添加的電話僅僅是爲了證明一個觀點,即電話插座不會在第二個電話之後呈現。我*真正*想要的是爲了恢復到原來的位置......如果可能的話。所以這個過程可能是這樣的: 用戶轉到/ posts/1/edit(not auth'd) 用戶登錄 用戶回到/ posts/1 /編輯 或者如果他們在/ posts/new我希望它能以同樣的方式行事...... – Ben 2013-05-01 22:14:54

+1

我確實創造了一個小提琴,但後來,似乎我們越過了路徑。至於你在做什麼,我遇到了同樣的問題。我仍在努力通過它,但我認爲通過讓插座保持不變,並在同一路線內渲染,我可以實現它。 – harn145 2013-05-01 22:17:57

+0

很酷。我開始想,也許我瘋了。我可能會在github的emberjs問題上發佈這個問題...... – Ben 2013-05-01 22:22:58