2012-04-07 49 views
2

我對主幹js有點困惑。通知事件使用coffeescript登錄並註銷主幹js

我有多個基於會話行爲不同的視圖。即。當我登錄後,我的所有視圖都將允許我評論並解決問題,但在註銷時,與用戶活動相對應的所有其他視圖都應提示登錄表單。

因此,困惑是關於,我應該如何通知其他視圖,當我登錄,讓他們讓我做相應的活動。

我目前能夠做到這一點,但我需要刷新頁面後,我登錄,但骨幹js的目的不滿足。

用戶模型:user.js.coffee

class window.User extends Backbone.Model 
    urlRoot: '/users' 

    isSignedIn: -> 
    Boolean(@get('remember_token')) 

    login: (attributes, options) -> 
    options.url = Root + '/sessions' 
    @save(attributes, options) 

    signup: (attributes, options) -> 
    options.url = Root + '/users/create' 
    @save(attributes, options) 

登錄視圖:signin_view.js.coffee

class window.UserView extends Backbone.View 
    initialize: -> 
    _.bindAll(this, 'onSignedIn', 'onSignedUp', 'onCommented') 
    $(@el).show() 

    if @model.isSignedIn() 
     @showUserDetails() 
    else 
     Some code here 

用戶詳細視圖:user_detail_view.js.coffee

class window.UserDetailsView extends Backbone.View 
    initialize: -> 
    _.bindAll(this, 'onValidUser') 
    @model.on('change', @onValidUser) 

    if (@model.get('email')) 
    @onValidUser() 
    else 
    @model.fetch() 

    onValidUser: -> 
    @render() 

    render: -> 
    $(@el).show() 
     this.$(".name").text(currentUser.get('user')['first_name'] + ' ' + currentUser.get('user')['last_name']) 

現在我想通知我的後續視圖,即時登錄,我不應再提示登錄形式了,實際上所有的意見重新遲來用戶活動

關注視圖看起來像這樣

class window.FollowView extends Backbone.View 
    initialize: -> 
    $(@el).show() 

如何實現這一目標?

在此先感謝

回答

3

我認爲你有點結構性問題。 「簽名」不是用戶的財產,而是整個應用程序的屬性:如果他們沒有登錄,那麼應用程序沒有用戶,如果他們已經登錄,那麼應用程序確實有一個用戶。

所以你應該有一個具有用戶屬性的應用程序對象。當人登錄時,將用戶設置在應用程序對象上;當人員退出時,請清除用戶。

一旦達到上述要求,解決方案自然就會失敗:我們使用Backbone,因此一切都基於觸發和監聽事件,此處的事件爲signed-insigned-out。什麼觸發了這些事件?應用程序對象。誰在監聽這些事件?如果某人簽名或不簽名,這些意見會被關注。

假設你有一個應用程序類是這樣的:

class App 
    constructor: (@user_name) -> 
     _(@).extend(Backbone.Events); 
    sign_out: -> 
     @user_name = null 
     @trigger('signed-out') 
    sign_in: (user)-> 
     @user_name = user 
     @trigger('signed-in') 
    user: -> 
     @user_name 

window.app = new App 

然後看法是關心用戶可以做這樣的事情:

initialize: -> 
    app.on('signed-in signed-out', @render) 

當有人簽上自己的render方法將被稱爲進入或退出;當然,render方法會檢查用戶並顯示相應的內容。

現場演示:http://jsfiddle.net/ambiguous/TfPf9/

真正的代碼可能希望有remove實現來app.off('signed-out signed-in'),以免晃來晃去的聽衆。

與其他幾件事情,而我在這裏:

  1. 使用bindAll是CoffeeScript的很少需要。取而代之的是:

    _.bindAll(this, 'onSignedIn', 'onSignedUp', 'onCommented') 
    

    定義方法與=>:骨幹

    onSignedIn: => #... 
    onSignedUp: => #... 
    
  2. 新版本給你一個jQuery /的Zepto包裹你的el版本自動所以你可以只用@$el.show()取代$(@el).show()

+0

哇。這是我所能得到的最好的解釋。非常感謝你設置基地的權利。再次感謝:) – 2012-04-07 20:11:13

+0

我使它工作。萬分感謝 :) – 2012-04-09 19:31:48