由于某些原因,我无法在@$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
答案 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");