2

バックボーン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()

どうすればこれを達成できますか?

前もって感謝します

4

1 に答える 1

3

構造的に少し問題があると思います。「signed-in-edness」は実際にはユーザーのプロパティではなく、アプリケーション全体のプロパティです。ユーザーがサインインしていない場合、アプリケーションにはユーザーがなく、サインインしている場合は、アプリケーションにはユーザーがいます。

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

上記が整ったら、ソリューションは自然に失敗します。バックボーンを使用しているため、すべてがイベントのトリガーとリッスンに基づいており、ここでのイベントは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. CoffeeScriptを使用bindAllする必要はほとんどありません。これの代わりに:

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

    =>メソッドを次のように定義します。

    onSignedIn: => #...
    onSignedUp: => #...
    
  2. Backbone の新しいバージョンでは、jQuery/Zepto でラップされたバージョンがel自動的に提供されるため$(@el).show()、単に@$el.show().

于 2012-04-07T19:36:51.447 に答える