当yii中的下拉列表更改时,我会渲染一些表单元素,如下所示:
$form->dropdownListRow($model, 'type', array('item1','item2','etc') ,
array('ajax'=>array(
'type'=>'POST',
'url'=>CController::createUrl('ProfileFieldRule/showAttributes'),
'update'=>'#showAttributes',
))
));
Run Code Online (Sandbox Code Playgroud)
ProfileFieldRule/showAttributes使用CHtml渲染表单元素,这导致了我的第一个问题 - 我必须使用opentag等,并重复在表单中完成的工作.
echo CHtml::openTag('div', array('class' => 'control-group '));
echo CHtml::activeLabel($attr, $name, array('class' => 'control-label'));
etc
Run Code Online (Sandbox Code Playgroud)
第二个问题是:如果没有更改事件(例如提交的表单有错误),则不会加载动态内容.
我正在传递模型并检查它是否为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>
Run Code Online (Sandbox Code Playgroud)
如果我可以调用上面的代码onload,onchange,并且仍然可以访问$ form,那将是理想的选择.
我对任何事情持开放态度,那么如上所述,显示和保持动态内容的最佳(或好)解决方案是什么?
提前感谢任何建议.
这是一个正在发生的事情的图像http://imgur.com/cZjRZ 注意,渲染的元素没有显示ajax验证(以红色/绿色突出显示),因为我对ajax很不好并且还在计算
我应该注意,我考虑的另一个解决方案是摆脱showAttributes,继续将两个模型传递给表单,并在更改时再次调用create action.然而,当更改下拉列表时,这会删除之前的ajax验证,因为整个表单被重绘.
我以前也遇到过这个问题。
问题出在 .bind('change') 上,您应该使用 .live('change') 代替,在 jQuery 1.7 中,这是通过使用同时执行实时绑定和正常绑定的 .on() 函数来解决的。令人难忘的是 Yii 没有最新的 jQuery。对于某些项目,我手动更新了 jQuery,但在中间您将必须扩展基类来修复您将遇到的 jQuery 错误。对于更直接的一次性解决方案,您可以编写一些 js,解除元素上事件的绑定,然后使用 .live() 函数重新绑定它们。但至少可以说,这一切都有点老套。
| 归档时间: |
|
| 查看次数: |
589 次 |
| 最近记录: |