I'm just learning about how to best organize my javascript code, and I had a question regarding this small piece of code I wrote:
var reportsControllerIndex = {
plotMapPoints: function(data) {
//plots points
},
drawMap: function() {
$.getJSON('/reports.json', function(data) {
reportsControllerIndex.plotMapPoints(data);
});
},
run: function() {
reportsControllerIndex.drawMap();
}
};
The question is regarding calling another function of reportsControllerIndex from within the reportsControllerIndex object. I had first tried the following piece of code for the run function:
run: function() {
this.drawMap();
}
which worked perfectly. However, I then quickly found doing this for the drawMap function:
drawMap: function() {
$.getJSON('/reports.json', function(data) {
this.plotMapPoints(data);
});
}
does not work, since "this" would now refer to the callback function of the getJSON call.
My solution was to just place reportsControllerIndex in front of all of the methods I want to call, but I was curious: is there a more relative way for calling functions within an overall object like this (much like you'd do with a class in a standard OO language)? Or am I forced to do it as I am currently, just calling the methods through the name of the object?
You want to store the this
binding in a variable.
drawMap: function() {
var _this = this;
$.getJSON('/reports.json', function(data) {
_this.plotMapPoints(data);
});
}
Late answer, but jQuery has a method called jQuery.proxy()
that is made for this purpose. You pass it the function along with the value of this
you want to retain, and it will return a function that ensures this
is correct.
This way you don't need to define a variable.
drawMap: function() {
$.getJSON('/reports.json', $.proxy(function(data) {
this.plotMapPoints(data);
}, this));
}
You need to use a variable reference to this
outside the getJSON
function. getJSON
sets the context of the callback within jquery.
Like this:
var self = this;
$.getJSON('/reports.json', function(data) {
self.plotMapPoints(data);
});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With