当在yii中更改下拉列表时,我呈现了一些表单元素,如下所示:
$form->dropdownListRow($model, 'type', array('item1','item2','etc') ,
array('ajax'=>array(
'type'=>'POST',
'url'=>CController::createUrl('ProfileFieldRule/showAttributes'),
'update'=>'#showAttributes',
))
));
ProfileFieldRule/showAttributes使用CHtml渲染表单元素,这导致了我的第一个问题-我必须使用opentag等,并重复在表单中完成的工作。
echo CHtml::openTag('div', array('class' => 'control-group '));
echo CHtml::activeLabel($attr, $name, array('class' => 'control-label'));
etc
第二个问题是:如果没有更改事件(例如,提交带有错误的表单),则不会加载动态内容。
我目前正在传递一个模型,并检查它是否为null,否则执行与ProfileFieldRule/showAttributes中相同的渲染,例如:
<div id="showAttributes">
<?php if (isset($attr)) {
//do the same rendering as in showAttributes
$vars = get_class_vars(get_class($attr));
foreach ($vars as $name => $value) {
//etc...
?>
</div>
如果我可以只调用上面的代码onload,onchange并仍然可以访问$ form,那将是理想的。
我无所不包,因此如上所述,显示和保留动态内容的最佳(或良好)解决方案是什么?
在此先感谢您的任何建议。
编辑
这是发生的事情的图像http://imgur.com/cZjRZ
请注意,渲染的元素没有显示ajax验证(以红色/绿色突出显示),因为我对ajax不好,并且仍然无法确定
我应该注意,我考虑过的另一种解决方案是摆脱showAttributes,继续将两个模型传递给表单,并在更改时再次调用create Action 。但是,当更改下拉列表时,由于重新绘制了整个表单,因此摆脱了先前的ajax验证。
最佳答案
我之前也有这个问题。
问题出在.bind('change'),您应该改用.live('change'),
在jQuery 1.7中,这是通过使用同时执行实时绑定(bind)和正常绑定(bind)的.on()函数解决的。
令人难忘的是Yii没有最新的jQuery。对于某些项目,我手动更新了jQuery,但是请注意,您将不得不扩展基类以修复将要获得的jQuery错误。
对于更直接,更一次性的解决方案,您可以编写一些js,将您的事件取消绑定(bind)到元素上,然后将其与.live()函数重新绑定(bind)。
至少可以这么说,这有点古怪。