问题
I made a class :
class @GameMap
options : {
'width' : 100,
'height' : 100,
'tileWidth' : 45,
'tileHeight' : 20,
'scale' : 5,
'moveDistance' : 100, #Distance to move with the map controlers
'showErrorMessages' : true,
'zindexDecorElementBase' : 99999,
'zindexGroudElementBase' : 88888
}
lang : {
'errContainerMissing' : "L'élement pour créer la carte n'existe pas"
}
constructor: (@element) ->
this.run()
run: ->
this.loadDatas()
loadDatas: (top,left) ->
$.ajax(
url: "/map/getnewcoord",
data: {
map_width : this.options.width,
map_height : this.options.height,
tile_height : this.options.tileHeight,
tile_width : this.options.tileWidth,
window_large : $('.map-windows').width(),
window_height: $('.map-windows').height(),
top : top ,
left : left
},
success: (data) ->
$.each(data,(index,item) ->
this.createTile(item.posX,item.posY);
)
)
createTile: (m,n) ->
#We are in the tile reference
yDelta = Math.round((options.width ) * options.tileHeight );
console.log('pass')
$ ->
gamemap = new GameMap("#map .block-map")
But i got the error
this.createTile is not a function
It's because the "this" is not the "this" of my class but one of item return by my json call.
How can i do to keep the "this" of my class in the ajax success callback function?
回答1:
Here's the CoffeeScript way to do it:
success: (data) =>
$.each(data,(index,item) =>
this.createTile(item.posX,item.posY);
)
This compiles to something very similar to alex's answer, but is, I think, much more readable. The =>
operator defines a function while using the this
that was present when it was defined, rather than when it was called.
While we're at it, you may find it more readable to use @
instead of this
:
@createTile(item.posX,item.posY);
回答2:
Keep a reference to this
.
A lot of people use a pattern such as var that = this
(or self
if it reads better for you).
Then, in your inner function, replace references to this
with that
, which will be the parent function's this
.
Alternatively, you can wrap the anonymous function definitions with $.proxy()...
fn = $.proxy(fn, this);
...which will ensure the this
inside is always the parent's this
. $.proxy()
is a cross browser way of achieving bind()
(which isn't implemented in the older IEs or Safari).
回答3:
You can pass the context
as param to the ajax()
method:
$.ajax({ /*...,*/ context: this/*, ...*/ });
http://api.jquery.com/jQuery.ajax/
来源:https://stackoverflow.com/questions/8552270/how-to-stay-in-the-this-context-during-an-ajax-call-jquery-coffescript