2012-04-07 2 views
2

私はバックボーンjsと少し混同しています。イベントを通知するログインしてログアウトしたバックボーンjsとcoffeescript

私は、セッションに基づいて異なる動作をする複数のビューを持っています。すなわち、私のすべてのビューにログインすると、コメントが好きで問題に従うことができますが、ログアウトしているときに、ユーザーアクティビティに対応する他のすべてのビューはログインフォームを要求するはずです。

混乱は、ログインしたときに他のビューに通知して、対応するアクティビティを実行できるようにすることです。

私は現在これを達成することができますが、ログインした後にページを更新する必要がありますが、バックボーンjsの目的が達成されません。

Userモデル: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

おかげで私はあなたが構造的な問題のビットを持っていると思います。 「サインイン・エドネス」は実際にユーザーのプロパティではなく、アプリケーション全体のプロパティです。サインインしていない場合、アプリケーションにユーザーがなく、サインインしている場合アプリケーションにはユーザーがいます。

したがって、ユーザープロパティを持つアプリケーションオブジェクトが必要です。ユーザーがサインインすると、ユーザーをアプリケーションオブジェクトに設定します。人がサインアウトしたら、ユーザーをクリアします。

上記が完了すると、ソリューションは自然になくなります。私たちはバックボーンを使用しています。イベントはすべてトリガーとリスニングに基づいており、ここでのイベントは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/

実際のコードは、リスナーのダングリングを避けるためにapp.off('signed-out signed-in')removeの実装を持っている場合があります。

カップル他のものの私がここにいる間:

  1. bindAllを使用するには、CoffeeScriptのとほとんど必要ありません。

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

    =>を持つメソッドを定義します:代わりにこののバックボーンのバージョンはあなたのjQuery/Zeptoを与える

    onSignedIn: => #... 
    onSignedUp: => #... 
    
  2. 新しいあなただけ@$el.show()$(@el).show()を交換できるように自動的elのバージョンを包みました。

+0

ワウ。これは私が今まで持っていた最高の説明です。基本権を設定していただきありがとうございます。もう一度ありがとう:) –

+0

私はそれを働かせました。ありがとう、トン:) –

関連する問題