javascript-在CoffeeScript类中装饰函数

我正在编写一个骨干应用程序,我想编写一个经过身份验证的装饰器,可以用来装饰路由器类中的方法(路由)列表.

因此,我使用了几种方法的路由器,并尝试了类似的方法.但是,当我调用要装饰的路线时,装饰器未连接.

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

我该如何解决这个问题?

解决方法:

你有几个问题.

首先,我不认为初始化由于某种原因被调用.我可以说出来,因为如果它被调用了,那么它将引发错误(请参阅下一点).现在我不是骨干专家,但是也许尝试使用构造函数代替?

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

其次,该循环将无法正常工作.您将@ [method]替换为新函数,该函数在该函数中调用@ [method].成功后,您将获得一个递归的无限函数调用.因此,请保存对原始函数的引用,然后使用decorator函数调用该引用.

而且当您在那儿时,不需要下划线,因为coffee脚本确实循环得很好.而且,您甚至根本不需要关闭该循环,因为您仅立即使用了循环值.

这个略有改动的非主干版本可以使用:

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​

上一篇:javascript-jQuery.ajax仅*检索状态代码,而不检索/下载整个文档?


下一篇:javascript-将事件从服务传递到Angular中的控制器