I am using Struts 2 <s:checkbox />
in my form processing, along with AngularJS and jQuery.
Before submitting, I need validation and until now we do this in the project:
When we press Submit button, this function is called:
$scope.processForm('myForm', '<s:url value="/form/validate.action" />', '<s:url value="/form/save.action" />');
, where processForm(formId, validateUrl, submitUrl)
is a function defined by us:
$scope.processForm = function(form, validateUrl, submitUrl) { window.scroll(0,0); ProccessFormService.processStandarForm(form, validateUrl, submitUrl); };
And furthermore, we have processStandarForm()
defined in a global service:
angular.module('ourApp').controller('myFormCtrl', function($scope, $modal, ProccessFormService) { ... }
In service:
(function() { angular.module('ourApp').factory('ProccessFormService', ['$http', function($http) { processStandarForm: function(form, validateUrl, submitUrl) { this.processForm(form, validateUrl, submitUrl); }, processForm: function(form, validateUrl, submitUrl, success) { if ((typeof form) == 'string') { form = document.getElementById(form); } var data = this.form2Object(form); var ctrl = this; if (data) { if (validateUrl) { $http({ method : 'POST', url : validateUrl, data : $.param(data), // pass in data as strings headers : { 'Content-Type': 'application/x-www-form-urlencoded' } // set the headers so angular passing info as form data (not request payload) }).success(function() { if (!success) { form.action = submitUrl; form.submit(); } else { ctrl.submitAjaxForm(submitUrl, data, success) } }); } else if (submitUrl) { if (!success) { form.action = submitUrl; form.submit(); } else { this.submitAjaxForm(submitUrl, data, success) } } } }, }
Basically, we are submitting twice the form, firstly for validation, then for submitting.
What I don't understand, is that if I debug in action class, in the function of validate()
, the boolean value of <s:checkbox />
is always true, but in submit()
function, boolean values are submitted correctly, according to they are checked/not checked. Checkboxs are like this:
<div class="col-sm-12 form-checkbox"> <s:checkbox name = "myForm.married" ng-model = "checkboxModel" value = "<s:property value='%{myForm.married}'/>" ng-change = "submitCheckbox();" ng-init = "checkboxModel= %{myForm.married}" theme = "simple" ng-disabled = "anotherFunction()" /> </div>
I understand that, the value submitted is fieldValue="xxx"
in <s:checkbox />
, and by default is true. So I did this to change the fieldValue
of every checkbox
before the page is loaded. Although all the script are executed, nothing changed. I still get all true in validation.
$(document).ready(function(){ $( "input:checkbox" ).each(function(){ var checkbox = $(this); var checked = checkbox.prop("checked");//sera false/true if (checked == true){ checkbox.prop("fieldValue", "true"); } else { checkbox.prop("fieldValue", "false"); } }); });
So, how can I get right boolean
values not only in submitting, but also in validation?? Is the Angular service wrongly written ? I really doubt that but I am not able to figure out the question.