3

バックボーンアプリケーションを作成しています。ルータークラスのメソッド(ルート)のリストを装飾するために使用できる認証済みデコレーターを作成したいと思います。

だから私はいくつかの方法でルーターを持っていて、このようなものを試しました。ただし、デコレーションしたいルートを呼び出すと、デコレータがアタッチされません。

class MyApp extends Backbone.Router

  routes: 
    ''         : 'home'
    'foo'      : 'foo'
    'bar'      : 'bar'


  authenticated: ['foo', 'bar'] 

  initialize: ->
    @decorateAuthenticatedFunctions()      

  decorateAuthenticatedFunctions: => 
    _.each @authenticated, (method)=>
      @[method] = (args)=>
        if @authorized()
          @[method].apply @, args
        else
        @navigate '', true

  authorized: =>
    @user? and @user.loggedIn 

  foo: =>
    #do stuff

  bar: =>
    #do stuff

この問題を解決するにはどうすればよいですか?

4

2 に答える 2

3

いくつか問題があります。

initializeまず、何らかの理由で呼び出されているとは思いません。呼び出された場合、エラーが発生するため、わかります(次のポイントを参照)。今、私はバックボーンの専門家ではありませんが、代わりにコンストラクターを使用してみてください。

class MyApp extends Backbone.Router
  constructor: ->
    super
    @decorateAuthenticatedFunctions()

第二に、そのループは機能しません。@[method]その関数で呼び出される新しい関数に置き換えられ@[method]ます。成功すると、再帰的に無限の関数呼び出しが行われます。したがって、元の関数への参照を保存してから、デコレータ関数でその参照を呼び出します。

コーヒースクリプトは非常にうまくループするので、そこにいる間はアンダースコアは必要ありません。また、ループ値をすぐに使用するだけなので、このループのクロージャーはまったく必要ありません。

このわずかに変更された非バックボーン バージョンは動作します。

http://jsfiddle.net/ybuvH/2/

class MyApp

  authenticated: ['foo', 'bar'] 

  constructor: ->
    @decorateAuthenticatedFunctions()      

  decorateAuthenticatedFunctions: =>
    for method in @authenticated
      fn = @[method]
      @[method] = (args) =>
        if @authorized()
          fn.apply @, args
        else
          console.log 'denied'

  authorized: =>
    @user? and @user.loggedIn 

  foo: =>
    console.log 'foo'

  bar: =>
    console.log 'bar'

app = new MyApp

app.user = { loggedIn: no }
app.foo() # denied
app.bar() # denied

app.user = { loggedIn: yes }
app.foo() # foo
app.bar() # bar​

</p>

于 2012-06-15T22:50:15.967 に答える
0

thisコンテキストの問題があると思います。

「太い矢印」は関数定義時に=>バインドされることに注意してください。thisしたがって、代わりにインスタンスにバインドする場合decorateAuthenticatedFunctions: =>は、 globalthisにバインドします。MyApp

これを試して:

...

initialize: ->
  @decorateAuthenticatedFunctions.call(@) # Call with proper context

decorateAuthenticatedFunctions: ->    # Use skinny arrow
  _.each @authenticated, (method)=>
    @[method] = (args)=>
      if @authorized()
        @[method].apply @, args
      else
      @navigate '', true

authorized: ->                        # Use skinny arrow
  @user? and @user.loggedIn 

...
于 2012-06-15T22:37:32.000 に答える