AlloyUI FormValidator 动态js绑定

之前我有写过一篇<aui:validator/>标签的使用说明。

但是只适用于固定的页面。

如果是在页面中通过js动态创建的DOM元素的话,是无法生效的。我通过查阅alloyui 和yui的官网,以及在liferay的官网上的检索。总结了一下动态绑定aui表单验证的解决方案。
假使我们的表单id为 fm

假使我们通过js创建了一个

<input type="text" id="id1" name="name1"/>

这样的元素。我们想要绑定的事件。让这个元素为必填项,且值只能为 aaa

那么我们可以通过js来这么实现:

1.让我们来看看如何实现让此输入框必填。

在创建dom元素之后执行下面的方法

 

<script>
var fieldRequiredLabel = "此字段为必输项";
var inputDom = document.getElementById("id1");
var rulesJson = "{" + inputDom.getAttribute("name") + ":{required:true}}";
rulesJson = eval('(' + rulesJson + ')');
var fieldStringsJson = "{" + inputDom.getAttribute("name") + ":{required:\""+fieldRequiredLabel+"\"}}";
fieldStringsJson = eval('(' + fieldStringsJson + ')');
bindFormValid(rulesJson,fieldStringsJson)
</script>
<aui:script>
function bindFormValid(rulesJson,fieldStringsJson) {
AUI().use(
  'aui-form-validator',
  function(Y) {
        new Y.FormValidator(
      {
        boundingBox: '#fm',
        fieldStrings: fieldStrings,
        rules: rules,
        showAllMessages: true
      }
    );
  }
);
}
</aui:script>

这样我们就实现了动态创建的输入框的必填校验。类似的简单校验。比如只可以填数字。最大长度等。都可以通过这种方式来实现。

2.自定义校验函数的实现。

更多的时候我们需要的不只是简单的校验。往往还需要自定义的一些方法来实现。例如我们想判断输入框必填,且判断其值是否是 aaa 如果是 则通过校验。
在创建dom元素之后执行下面的方法
js代码示例如下:

<script>
var shouldBeaaaLabel="此字段仅可输入 aaa";
var fieldRequiredLabel = "此字段为必输项";
var inputDom = document.getElementById("id1");
var rulesJson = "{" + inputDom.getAttribute("name") + ":{required:true,custom:true,shouldBeaaa:true}}";
rulesJson = eval('(' + rulesJson + ')');
var fieldStringsJson = "{" + inputDom.getAttribute("name") + ":{required:\""+fieldRequiredLabel+"\",shouldBeaaa:\""+shouldBeaaaLabel+"\"}}";
fieldStringsJson = eval('(' + fieldStringsJson + ')');
bindFormValid(rulesJson,fieldStringsJson)
</script>
<aui:script>
function bindFormValid(rulesJson,fieldStringsJson) {
AUI().use(
  'aui-form-validator',
  function(Y) {
    var CONFIG = Y.config.FormValidator;
     Y.mix(CONFIG.RULES, {shouldBeaaa: function (val, fieldNode, ruleValue) {
      var result = false;
      if(val == 'aaa'){
        result = true;
      }
      return result;
    }
        new Y.FormValidator(
      {
        boundingBox: '#fm',
        fieldStrings: fieldStrings,
        rules: rules,
        showAllMessages: true
      }
    );
  }
);
}
</aui:script>

这样就实现了通过js为动态创建的页面元素来绑定 aui的简单校验与自定义校验。

当使用了动态绑定的校验器之后不知道是什么原因。当我的表单校验全部正确的时候,无法提交表单。经调查之后,找到了曲线救国的方案。在绑定校验器的时候,将校验器放置在一个数组之中。

在 form的 onSubmit里面 填写 event.preventDefault();

然后给submit按钮绑定事件。代码如下:

遍历所有的校验器,调用校验方法,判断是否有错误。

如果全部没有错误。那么再次遍历校验器,覆盖事件触发。然后提交表单即可。

var myvalidators=new Array();
function showErrs(){
	var canSubmitFlag = true;
	AUI().ready('aui-form-validator',function (A) {
	for(var i = 0; i < myvalidators.length; i++){
		var validator1 = myvalidators[i];
		validator1.validate();
		if(validator1.hasErrors()){
			canSubmitFlag = false;
			break;
		}
	}
	if(canSubmitFlag){
		for(var i = 0; i < myvalidators.length; i++){
			var v = myvalidators[i];
			v.on("validateField", function (event) {
				for (var k in event.details) {
					var name = event.details[k].validator.field;
					event.halt();
					break;
				}
		});
		}
		<portlet:namespace/>mySubmit();
	}else{
		canSubmitFlag = true;
	}
});
}

但是接下来会遇到的问题就是js中无法获取jsp中通过标签写出来的校验器。无法判断是否正确通过校验。那么我们的解决办法就是在js的ready方法中覆盖页面的标签生成的校验器。

但是。。。。还是有问题。当删除dom结构的时候,对应的校验器无法删除。会报错。那么 解决方案就是在触发删除dom的函数中。从array中获取对应的校验器。重写触发的方法,使其无法触发,并在数组中将其删除即可。