Problems with function literal used as DWR callback.

I have written a piece of code to be executed on form submit. The code consists of a containing object called EventHandler which handles both initialisation and execution of event handlers.

I use prototype for the eventhandling code. The problem is that the property error of type StringBuffer (another object) does not play well with the function literal myCallback (which is invoked by DWR).

I want to store all validation errors in the error property for access later but neither of the two versions I have attached the code to does the trick for me. I am guessing it has to do with the scope in JavaScript but I can't pinpoint the problem.

Any help greatly appreciated!
//
//Invoked by
//
Event.observe(matchPlayerFormId, 'submit', this.formSubmit.bind(this));
 
//
//Version 1
//
EventHandler.prototype.formSubmit = function(event) {
	this.error = new StringBuffer();
 
	var myCallback = function(data){
		console.log("in callback, result = '" + data + "'");
		if (data.length > 0) {
			this.error.append(data);
			console.log("Intermediate: " + error.toString());
		}
	};
 
	for (var i = 0; i < this.validationNodes.length; i++){
		var variableId = this.validationNodes[i].id;
			
		var variableName = this.validationNodes[i].name;
	
		var variableValue = document.getElementById(variableId).value;
		
		JMatchValidator.validate(variableName, variableValue, myCallback.bind(this));
 
	}
		
	if (this.error.length() > 0){
		console.log("Submit cancelled");
		Event.stop(event);
		
	}
}
 
//
//Version 2
//
EventHandler.prototype.formSubmit = function(event) {
	var error = new StringBuffer();
 
	var myCallback = function(data){
		if (data.length > 0) {
			error.append(data);
		}
	};
 
	alert("Start submit");
	for (var i = 0; i < this.validationNodes.length; i++){
		var variableId = this.validationNodes[i].id;
			
		var variableName = this.validationNodes[i].name;
	
		var variableValue = document.getElementById(variableId).value;
 
		JMatchValidator.validate(variableName, variableValue, myCallback.bind(this));
 
	}
		
	if (error.length() > 0){
		console.log("Submit cancelled");
		Event.stop(event);
		
	}
}

Open in new window

kveasanaAsked:
Who is Participating?
 
BadotzConnect With a Mentor Commented:
// Try this:
//
var self = this;
JMatchValidator.validate(variableName, variableValue, myCallback.bind(this, self));

// I have noticed that "bind" drops the first object from the argument list
// The first object bwcomes the object that is "called"
0
 
Computer101Commented:
Forced accept.

Computer101
EE Admin
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.