ecomfe / ef

ef is a integration framework with er & esui
14 stars 15 forks source link

ChildView中控件的Validate不会在提交时触发 #27

Closed srhb18 closed 10 years ago

srhb18 commented 10 years ago

现象:ChildView中的InputControl控件在表单提交时,不会触发控件自身的验证逻辑;

原因:Form在触发各控件的验证逻辑前,会先进行一次对InputControl控件的查找,只有满足一定逻辑的控件才会添加进触发验证的数组,其中一个条件为control.viewContext === form.viewContext,但显然ChildView中的控件和Form并不在同一个viewContext中,因此ChildView中的控件就不会加入到触发验证的控件数组中去。

解决方案:

  1. 修改Form判断是否InputControl的逻辑,单独处理ChildView的情况,但是这种方案会使Form控件和ChildView间产生耦合;
  2. 让ChildView中的控件的viewContext在Form看起来和Form自己的一样,具体方案还没想出来;
  3. 单独触发ChildView中InputControl的validate,但因为触发验证的过程在getData中,因此要么将getData和触发验证的逻辑分开,要么就是分为两步验证,即如果正常的控件无法通过验证并报错,ChildView中的控件不会触发验证;
otakustay commented 10 years ago
  1. ChildView不是只给表单用的
  2. 无论是检验还是getData,都和其它非InputControl的控件或者ActionPanel一样处理
srhb18 commented 10 years ago

所以,是否应该继承出ChildFormView这样的东西出来?

otakustay commented 10 years ago

那一起做ChildFormAction?

Gray Zhang 已使用 Sparrow (http://www.sparrowmailapp.com/?sig)

已使用 Sparrow (http://www.sparrowmailapp.com/?sig)

在 2014年8月7日 星期四,下午5:45,srhb18 写道:

所以,是否应该继承出ChildFormView这样的东西出来?

— Reply to this email directly or view it on GitHub (https://github.com/ecomfe/ef/issues/27#issuecomment-51451376).

srhb18 commented 10 years ago

在ChildView中增加一个validate接口:

/**
         * 验证View内的Input控件
         *
         * @return {Bool} result 是否通过验证
         */
        exports.validate = function () {
            var inputs = this.viewContext.controls;
            var result = true;

            u.each(
                inputs,
                function (input) {
                    if (input.getCategory() === 'input' || input.getCategory === 'check') {
                        if (!input.isDisabled()) {
                            result &= input.validate();
                        }
                    }
                }
            );

            return !!result;
        };

在主View里注册formaftervalidate处理函数,调用上面的接口:

function validateChildView(e) {
            var validate = this.get('strategy-delivery-price-mode-and-unit-price').get('view').validate();
            if (!validate) {
                e.preventDefault(); 
            }
        }
srhb18 commented 10 years ago

试了一下,目前来看可行

otakustay commented 10 years ago

ChildView不会为表单做特别处理,ef也不会知道有表单这样的页面,剩下的不属于ef的范畴,可以具体想清楚了不同方案和对比选择,在适当的库里讨论

otakustay commented 10 years ago

另外我觉得做一个能判断有特别标识的ChildView和ChildAction的Form子类可能更有效

Gray Zhang 已使用 Sparrow (http://www.sparrowmailapp.com/?sig)

已使用 Sparrow (http://www.sparrowmailapp.com/?sig)

在 2014年8月7日 星期四,下午6:08,srhb18 写道:

试了一下,目前来看可行

— Reply to this email directly or view it on GitHub (https://github.com/ecomfe/ef/issues/27#issuecomment-51453391).