我正在为我的表单编写几个(自定义)验证器,所有内容都一如既往地顺利进行,但只有一个小问题。
我有两个字段:一个是html选择输入(又名dropDownList
),另一个是简单的textField
。
我已经设置了我的ajax验证器,以便在dropDownList
选择 X 选项时,textField
中的文字不能为空。
当用户在dropDownList
中选择 X 选项时,会出现一条错误消息(对于dropDownList
,请注意):文本字段Y可以不是空的。
到目前为止很好。当我然后单击textField
时,键入一些内容并单击屏幕上的其他位置,确定ajax验证器被触发,HTTP响应为空,表示表单上没有错误。 但错误消息不会消失!
我猜这与我在另一个字段上使用一个字段的验证器到clearErrors()
的事实有关,但这不应该有效吗?我已将正确的字段作为参数提供给clearErrors()
方法..
有谁知道我可能会出现什么问题?
提前致谢
编辑这是我的表单模型的链接:click
当我更改target_constant
或source_constant
时,会向服务器触发验证程序。 正在工作,我的意思是服务器将AJAX响应发送到我的验证器被激活。 此外,响应正文没有错误消息,但target_reg
或source_reg
的错误消息(取决于哪些受影响)不< / em>在同一时刻离开。只有在下一个请求/响应中,错误消息才会消失。
答案 0 :(得分:2)
我刚看了一下,但是发现代码没有问题。似乎实际验证工作(您获得了正确的数据),但Javascript(yiiactiveform.js)仅更新上次编辑的字段的数据。这与检查所有字段的服务器端验证相反。从用户的角度来看,仅显示当前正在编辑的字段的错误是有意义的,但是当您进行复杂的交互时,这当然有点缺乏。我在这里拖延很多,所以我想出了一个“解决方案”。您可以对任何属性使用afterValidateAttribute回调来强制使用$ .fn.yiiactiveform.updateInput呈现错误消息:
<div class="row">
<?php echo $form->labelEx($model,'text'); ?>
<?php echo $form->textField($model,'text'); ?>
<?php echo $form->error($model,'text', array('afterValidateAttribute' => 'js:function(form, attribute, data, hasError)
{
mSettings = $.fn.yiiactiveform.getSettings(form);
$.fn.yiiactiveform.updateInput(mSettings.attributes[0], data, form)
}')); ?>
</div>
它做什么?在回调中,我开始使用一些数据。这里最有趣的是数据 - 这是AJAX JSON响应,包含所有属性的错误。在函数I中,然后获取currentform的设置。这很重要,因为我必须找到我想要操作的属性对象。然后我手动调用updateInput,并传递我想要修改的属性对象,以及回调中的数据和表单。问题在于你必须找出属性对象中哪个从零开始的索引是你的对象。我是通过console.log做到的。 Et voila,您的属性会更新。 我只是希望没有更简单的方法来做到这一点,我花了这么多时间在它上面。 :P
答案 1 :(得分:2)
不要像{/ 1>这样的$form
html字段添加自定义“ID”
$form->textField($model, 'test_field', array('id' => 'custom_id');
如果需要添加自定义ID,则必须将模型名称放在自定义ID之前,如此
$form->textField($model, 'test_field', array('id' => 'youModelName_custom_id');
自定义ID的另一种解决方法是使用自定义类名。