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

2 つ目の問題は、変更イベントがない場合 (フォームがエラーで送信された場合など)、動的コンテンツが読み込まれないことです。

私は現在モデルを渡し、それが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 検証を示していません (赤/緑で強調表示されています)。

私が検討した別の解決策は、showAttributes を取り除き、フォームに 2 つのモデルを渡し続け、変更時に create アクションを再度呼び出すことです。ただし、フォーム全体が再描画されるため、ドロップダウンが変更されると、以前の ajax 検証が取り除かれます。

4

1 に答える 1

1

私も以前にこの問題を抱えていました。

問題は .bind('change') にあります。代わりに .live('change') を使用する必要があります。jQuery 1.7 では、ライブ バインドと通常のバインドの両方を行う .on() 関数を使用することで解決されます。忘れられないことに、Yii には最新の jQuery がありません。一部のプロジェクトでは、jQuery を手動で更新しましたが、基本クラスを拡張して、発生する jQuery エラーを修正する必要があります。より直接的で 1 回限りの解決策として、要素のイベントをアンバインドし、.live() 関数で再バインドする js を少し書くことができます。しかし、控えめに言っても、それは少しハックです。

于 2012-12-21T09:28:30.407 に答える