如何使我的javascript方法可用于我的其他骨干方法?

时间:2014-01-01 01:50:29

标签: javascript backbone.js coffeescript

由于某些原因,我无法在@$inputTestDiv代码中访问定义的isStringEmpty变量和backbone.js方法。如果我在$.ajax成功方法之外使用它,我可以使用它们。这里是否存在范围问题,我不知道或是语法问题?谢谢!

testapp.js.coffee

  el = $('body')
  TestApp.app.appView = new TestApp.code.views.AppView { el } if el.length

test_app.js.coffee

class TestApp.code.views.AppView extends Backbone.View

  events:
    'click a#test_btn' : 'doSomething'

  initialize: ->
    @setupElements()

  setupElements: ->
    @$inputTestDiv = @$el.find 'input#test_div'

  isStringEmpty: (str) ->
    str.trim().length == 0

  doSomething: =>
    $('input#test_div').append("WORKS") if @isStringEmpty("test") #this works
    $.ajax
      type : 'GET'
      dataType : 'json'
      url : '/users'
      success: (result) ->
        if @isStringEmpty(result) # browser can't find isStringEmpty method
          @$inputTestDiv.html("YES") # browser says @$inputTestDiv is undefined

2 个答案:

答案 0 :(得分:0)

在JavaScript中分配@this是一个问题:在success回调中,this不是您的视图对象,因为回调是直接调用的,不是视图对象的属性,也不是绑定函数。

要做到这一点,请查看this answer on function binding in CoffeeScript

或者,您可以在调用self = this之前指定view(或更有意义的名称,可能是$.ajax),并将@的使用替换为所述变量success回调。

答案 1 :(得分:0)

这绝对是范围问题。你必须使用如下:

doSomething: =>
    var self = this;
    $('input#test_div').append("WORKS") if @isStringEmpty("test") #this works
    $.ajax
        type : 'GET'
        dataType : 'json'
        url : '/users'
        success: (result) ->
             if self.isStringEmpty(result) 
                self.$el.find('#inputTestDiv').html("YES");