Reputation: 228
I'd like to bind click events to surfaces which I collected in an array. Every time a click is fired, I'd like to emit a message. But every click should emit it's own data. I know I have a problem with the scope but I couldn't figure out how to solve it :(
for(var i=0; i < clickableSurfaces.length; i++) {
clickableSurfaces[i].on('click', function() {
// output: undefined
console.log(this.options[i]);
// output: desired data
console.log(this.options[0]);
// emit data another view
this._eventOutput.emit('foo', {data: this.options[i]});
}.bind(this));
}
Somehow I have to get the i
variable to work inside of .on(...)
but binding it (.bind(this, i)
) didn't work.
Does anyone know how to solve it or could point me in the right direction?
Upvotes: 0
Views: 163
Reputation: 14353
It might be easier to bind the data when you setup the listener. This way you are not worried about the index value of the object passed.
for(var i=0; i < clickableSurfaces.length; i++) {
clickableSurfaces[i].on('click', function(data, event) {
// data = this.options[i]
console.log(data);
// emit data to another view
// this = anotherView in this case
this._eventOutput.emit('foo', {data: data});
}.bind(anotherView, this.options[i]));
}
anotherView.on('foo', function(event) {
// event.data was emitted with the event
console.log(event.data);
});
Upvotes: 1
Reputation: 228
Found the solution: You not only have to bind the "i" to the event, you also have to assign the parameter "i" to the function.
Full code:
for(var i=0; i < clickableSurfaces.length; i++) {
clickableSurfaces[i].on('click', function(**i**) {
// output: undefined
console.log(this.options[i]);
// output: desired data
console.log(this.options[0]);
// emit data another view
this._eventOutput.emit('foo', {data: this.options[i]});
}.bind(this, **i**));
}
Upvotes: 0