当我用正常请求(非ajax)打开页面时,一切正常。 但是当我用ajax加载该表单时,该表单中的客户端验证不起作用。
表单生成器是经典的gii生成的东西:
$form = $this->beginWidget('CActiveForm', array(
'id'=>'cat-form',
'enableAjaxValidation'=>true,
'action' => ...,
'clientOptions'=>array('validateOnSubmit'=>true),
)
);
// - form inputs go here -
$this->endWidget();
Ajax加载完成如下:
$.get(page, function(formHtml) {
$('#content').html(formHtml);
});
我不得不用processOutput = true
调用renderPartial,以便输出javascript。小部件生成的javascript如下所示:
$('#cat-form').yiiactiveform({'validateOnSubmit':true,'attributes':[...]});
我已经将问题追溯到这样一个事实:当$('#cat-form')
选择完成时,返回的jQuery对象是空的,即还没有表单。
如何在Yii中为ajax加载的内容正确添加客户端验证?
我很蠢,因为这个而浪费了4个小时:
var slider = $('.slider');
var slide = $('<div class="slide">').html(resp); // facepalm
// few lines later..
slider.append(slide);
因此,当表单只在临时元素中时,脚本被执行,该元素尚未附加到页面上。因此,$('#form')
没有发现任何内容。
答案 0 :(得分:9)
由于我浪费了几个小时寻找解决方案(我觉得这在编程中发生了很多),我现在也可以解释整个事情,以便其他人不必像我一样。 :|
$form = $this->beginWidget('CActiveForm', array(
'enableAjaxValidation'=>true,
...
public function actionCreate() {
$model=new Model;
$this->performAjaxValidation($model);
...
$outputJs = Yii::app()->request->isAjaxRequest;
$this->renderPartial('_form', array('model'=>new Model), false, $outputJs);
$.get(url, function(resp) {
$('#content').html(resp);
// !! DO NOT append the html to element that is not yet part of the document
// var slide = $('<div>').html(resp); // WRONG
// $('.slides').append(slide); // WRONG
祝你好运。