Skip to content

Commit 30f8541

Browse files
committed
修正添加验证的机制
1 parent e03ebf6 commit 30f8541

File tree

11 files changed

+243
-252
lines changed

11 files changed

+243
-252
lines changed

build.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ var array = [
44
// require('./buildIE6Sauce'),
55

66
require('./buildIE9'),
7-
require('./buildIE9Test')
7+
require('./buildIE9Test')
88
]
99
Promise.all(array).then(function() {
1010
console.log('build complete!!!')

buildIE6.js

+6-7
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,12 @@ module.exports = rollup.rollup({
5353
/*
5454
https://github.com/RubyLouvre/avalon/tree/2.2.3
5555
56-
57-
fix VElement hackIE BUG
58-
avalon.bind 在绑定非元素节点也要修正事件对象
59-
处理expr的null undefined情况
60-
修正error函数参数顺序导致的错误
61-
支持组件继承(对象形式与函数形式皆可)
62-
添加对安卓4.4, safari7, firefox50, chrome55的测试
56+
修正IE下 orderBy BUG
57+
更改下载Promise的提示
58+
修复avalon.modern 在Proxy 模式下使用ms-for 循环对象时出错的BUG
59+
修复effect内部传参 BUG
60+
重构ms-validate的绑定事件的机制
61+
6362
*/
6463
})
6564
var now = new Date

buildIE9.js

+7-6
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,13 @@ module.exports = rollup.rollup({
5252
/*
5353
https://github.com/RubyLouvre/avalon/tree/2.2.3
5454
55-
fix VElement hackIE BUG
56-
avalon.bind 在绑定非元素节点也要修正事件对象
57-
处理expr的null undefined情况
58-
修正error函数参数顺序导致的错误
59-
支持组件继承(对象形式与函数形式皆可)
60-
*/
55+
修正IE下 orderBy BUG
56+
更改下载Promise的提示
57+
修复avalon.modern 在Proxy 模式下使用ms-for 循环对象时出错的BUG
58+
修复effect内部传参 BUG
59+
重构ms-validate的绑定事件的机制
60+
61+
*/
6162
})
6263
var now = new Date
6364
var snow = now.getFullYear() + '-' + (now.getMonth() + 1) +

dist/avalon.js

+67-79
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
/*!
2-
built in 2017-1-3:21:45 version 2.2.3 by 司徒正美
2+
built in 2017-1-4:0:37 version 2.2.3 by 司徒正美
33
https://github.com/RubyLouvre/avalon/tree/2.2.3
44
5-
6-
fix VElement hackIE BUG
7-
avalon.bind 在绑定非元素节点也要修正事件对象
8-
处理expr的null undefined情况
9-
修正error函数参数顺序导致的错误
10-
支持组件继承(对象形式与函数形式皆可)
11-
添加对安卓4.4, safari7, firefox50, chrome55的测试
5+
修正IE下 orderBy BUG
6+
更改下载Promise的提示
7+
修复avalon.modern 在Proxy 模式下使用ms-for 循环对象时出错的BUG
8+
修复effect内部传参 BUG
9+
重构ms-validate的绑定事件的机制
1210
1311
*/(function (global, factory) {
1412
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : global.avalon = factory();
@@ -6192,41 +6190,11 @@ avalon.bind 在绑定非元素节点也要修正事件对象
61926190
function duplexBind(vdom, addEvent) {
61936191
var dom = vdom.dom;
61946192
this.dom = dom;
6193+
this.vdom = vdom;
61956194
this.duplexCb = updateDataHandle;
61966195
dom._ms_duplex_ = this;
61976196
//绑定事件
61986197
addEvent(dom, this);
6199-
//添加验证
6200-
6201-
var rules = vdom.rules;
6202-
this.rules = rules;
6203-
//将当前虚拟DOM的duplex添加到它上面的表单元素的validate指令的fields数组中
6204-
if (rules && !this.validator) {
6205-
addValidate(this, dom, true);
6206-
}
6207-
}
6208-
6209-
function addValidate(field, dom, once) {
6210-
while (dom && dom.nodeType === 1) {
6211-
var validator = dom._ms_validate_;
6212-
if (validator) {
6213-
field.validator = validator;
6214-
if (avalon.Array.ensure(validator.fields, field)) {
6215-
validator.addField(field);
6216-
}
6217-
break;
6218-
}
6219-
var p = dom.parentNode;
6220-
if (once && p && p.nodeType === 11) {
6221-
//如果input元素是循环生成的,那么它这时还没有插入到DOM树,其根节点是#document-fragment
6222-
setTimeout(function () {
6223-
addValidate(field, dom);
6224-
});
6225-
break;
6226-
} else {
6227-
dom = p;
6228-
}
6229-
}
62306198
}
62316199

62326200
var valueHijack = true;
@@ -6539,7 +6507,6 @@ avalon.bind 在绑定非元素节点也要修正事件对象
65396507
init: duplexInit,
65406508
diff: duplexDiff,
65416509
update: function update(vdom, value) {
6542-
// var dom = vdom.dom
65436510
if (!this.dom) {
65446511
duplexBind.call(this, vdom, updateDataEvents);
65456512
}
@@ -6589,9 +6556,6 @@ avalon.bind 在绑定非元素节点也要修正事件对象
65896556
if (isObject(rules)) {
65906557
var vdom = this.node;
65916558
vdom.rules = platform.toJson(rules);
6592-
if (vdom.duplex) {
6593-
vdom.duplex.rules = vdom.rules;
6594-
}
65956559
return true;
65966560
}
65976561
}
@@ -6749,7 +6713,7 @@ avalon.bind 在绑定非元素节点也要修正事件对象
67496713
//也可以称之为safeValidate
67506714
vdom.vmValidator = validator;
67516715
validator = platform.toJson(validator);
6752-
6716+
validator.vdom = vdom;
67536717
vdom.validator = validator;
67546718
for (var name in valiDir.defaults) {
67556719
if (!validator.hasOwnProperty(name)) {
@@ -6761,10 +6725,22 @@ avalon.bind 在绑定非元素节点也要修正事件对象
67616725
}
67626726
},
67636727
update: function update(vdom) {
6728+
67646729
var validator = vdom.validator;
6765-
var dom = vdom.dom;
6766-
validator.dom = dom;
6730+
var dom = validator.dom = vdom.dom;
67676731
dom._ms_validate_ = validator;
6732+
var fields = validator.fields;
6733+
collectFeild(vdom.children, fields, validator);
6734+
avalon.bind(document, 'focusin', function (e) {
6735+
var dom = e.target;
6736+
var duplex = dom._ms_duplex_;
6737+
var vdom = (duplex || {}).vdom;
6738+
if (duplex && vdom.rules && !duplex.validator) {
6739+
if (avalon.Array.ensure(fields, duplex)) {
6740+
bindValidateEvent(duplex, validator);
6741+
}
6742+
}
6743+
});
67686744

67696745
//为了方便用户手动执行验证,我们需要为原始vmValidate上添加一个onManual方法
67706746
var v = vdom.vmValidator;
@@ -6785,18 +6761,12 @@ avalon.bind 在绑定非元素节点也要修正事件对象
67856761
onManual();
67866762
});
67876763
}
6788-
/* istanbul ignore if */
6789-
if (typeof validator.onInit === 'function') {
6790-
//vmodels是不包括vmodel的
6791-
validator.onInit.call(dom, {
6792-
type: 'init',
6793-
target: dom,
6794-
validator: validator
6795-
});
6796-
}
67976764
},
67986765
validateAll: function validateAll(callback) {
67996766
var validator = this;
6767+
var vdom = this.vdom;
6768+
var fields = validator.fields = [];
6769+
collectFeild(vdom.children, fields, validator);
68006770
var fn = typeof callback === 'function' ? callback : validator.onValidateAll;
68016771
var promises = validator.fields.filter(function (field) {
68026772
var el = field.dom;
@@ -6823,28 +6793,7 @@ avalon.bind 在绑定非元素节点也要修正事件对象
68236793
fn.call(validator.dom, reasons); //这里只放置未通过验证的组件
68246794
});
68256795
},
6826-
addField: function addField(field) {
6827-
var validator = this;
6828-
var node = field.dom;
6829-
/* istanbul ignore if */
6830-
if (validator.validateInKeyup && !field.isChanged && !field.debounceTime) {
6831-
avalon.bind(node, 'keyup', function (e) {
6832-
validator.validate(field, 0, e);
6833-
});
6834-
}
6835-
/* istanbul ignore if */
6836-
if (validator.validateInBlur) {
6837-
avalon.bind(node, 'blur', function (e) {
6838-
validator.validate(field, 0, e);
6839-
});
6840-
}
6841-
/* istanbul ignore if */
6842-
if (validator.resetInFocus) {
6843-
avalon.bind(node, 'focus', function (e) {
6844-
validator.onReset.call(node, e, field);
6845-
});
6846-
}
6847-
},
6796+
68486797
validate: function validate(field, isValidateAll, event) {
68496798
var promises = [];
68506799
var value = field.value;
@@ -6857,7 +6806,7 @@ avalon.bind 在绑定非元素节点也要修正事件对象
68576806
}
68586807
/* istanbul ignore if */
68596808
if (elem.disabled) return;
6860-
var rules = field.rules;
6809+
var rules = field.vdom.rules;
68616810
var ngs = [],
68626811
isOk = true;
68636812
if (!(rules.norequired && value === '')) {
@@ -6910,6 +6859,46 @@ avalon.bind 在绑定非元素节点也要修正事件对象
69106859
}
69116860
});
69126861

6862+
function collectFeild(nodes, fields, validator) {
6863+
for (var i = 0, vdom; vdom = nodes[i++];) {
6864+
var duplex = vdom.rules && vdom.duplex;
6865+
if (duplex) {
6866+
fields.push(duplex);
6867+
bindValidateEvent(duplex, validator);
6868+
} else if (vdom.children) {
6869+
collectFeild(vdom.children, fields, validator);
6870+
} else if (Array.isArray(vdom)) {
6871+
collectFeild(vdom, fields, validator);
6872+
}
6873+
}
6874+
}
6875+
6876+
function bindValidateEvent(field, validator) {
6877+
6878+
var node = field.dom;
6879+
if (field.validator) {
6880+
return;
6881+
}
6882+
field.validator = validator;
6883+
/* istanbul ignore if */
6884+
if (validator.validateInKeyup && !field.isChanged && !field.debounceTime) {
6885+
avalon.bind(node, 'keyup', function (e) {
6886+
validator.validate(field, 0, e);
6887+
});
6888+
}
6889+
/* istanbul ignore if */
6890+
if (validator.validateInBlur) {
6891+
avalon.bind(node, 'blur', function (e) {
6892+
validator.validate(field, 0, e);
6893+
});
6894+
}
6895+
/* istanbul ignore if */
6896+
if (validator.resetInFocus) {
6897+
avalon.bind(node, 'focus', function (e) {
6898+
validator.onReset.call(node, e, field);
6899+
});
6900+
}
6901+
}
69136902
var rformat = /\\?{{([^{}]+)\}}/gm;
69146903

69156904
function getMessage() {
@@ -6920,7 +6909,6 @@ avalon.bind 在绑定非元素节点也要修正事件对象
69206909
}
69216910
valiDir.defaults = {
69226911
validate: valiDir.validate,
6923-
addField: valiDir.addField, //供内部使用,收集此元素底下的所有ms-duplex的域对象
69246912
onError: avalon.noop,
69256913
onSuccess: avalon.noop,
69266914
onComplete: avalon.noop,

0 commit comments

Comments
 (0)