9

当在 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

第二个问题是:如果没有更改事件(例如提交错误的表单),则不会加载动态内容。

我目前正在传递一个模型并检查它是否为空,否则执行与 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 操作。然而,当下拉列表更改时,这摆脱了以前的 ajax 验证,因为整个表单被重绘。

4

1 回答 1

1

我之前也遇到过这个问题。

问题出在 .bind('change') 中,你应该使用 .live('change') 代替,在 jQuery 1.7 中,通过使用同时进行实时绑定和正常绑定的 .on() 函数解决了这个问题。令人难忘的是 Yii 没有最新的 jQuery。对于某些项目,我手动更新了 jQuery,但在中间你将不得不扩展基类来修复你会得到的 jQuery 错误。对于更直接和一次性的解决方案,您可以编写一些 js,将您的事件与元素解除绑定,然后使用 .live() 函数重新绑定它们。但至少可以说,这有点骇人听闻。

于 2012-12-21T09:28:30.407 回答