2

Yiiには、「患者」ビューというビューがあります。このビューには、最初のビューが読み込まれた後にajaxが読み込まれるCGridViewやその他の要素がいくつかあります。一部は、すでにajaxがロードされたdiv内にajaxがロードされています。つまり、2レベルの深さでネストされています。

これらのajaxがロードされたCGridViewには、ユーザーが各グリッドのページごとの結果の数を設定できるドロップダウンがあります。これは、ユーザーがajaxを使用してページに別の要素をロードするまで正常に機能します。別のグリッド(または他のグリッド)がajaxによってロードされた後、ロードされたばかりのグリッドを除いて、ページごとのajax関数の他のすべての結果が壊れます。

他のものをajaxでロードした後、他のCGridViewは、ページごとの結果のドロップダウンを使用すると、このjavascriptエラーをスローします。

TypeError:設定は未定義です

組み込みのCGridViewページャーは、すべてのグリッドで常に正常に機能するため、ページセレクターごとの結果で更新する正しい$.fn.yiiGridViewを見つける方法が必要です。

cgridviewをインラインでロードするコントローラーアクション:

public function actionInlineSearch()
{
   YiiSessions::model()->setFromRequestCookie();

    $model=new GeneExpressionCufflinksGene('search');
    $model->unsetAttributes();  // clear any default values 
    // page size drop down changed

    if (isset($_GET['gecgPageSize'])) {
        Yii::app()->user->setState('gecgPageSize',(int)$_GET['gecgPageSize']);
        unset($_GET['gecgPageSize']);  // would interfere with pager and repetitive page size change
    }
    $gecgPageSize=Yii::app()->user->getState('gecgPageSize');

    if(isset($_REQUEST['GeneExpressionCufflinksGene']))
        $model->attributes=$_REQUEST['GeneExpressionCufflinksGene'];

    $this->renderPartial('inlineSearch',array('model'=>$model,'gecgPageSize'=>$gecgPageSize), false, true);
}

CGridViewウィジェットをロードするinlineSearchビュー:

 // $columns[]='normal_allele_depth';
// $columns[]='normal_allele_freq';

echo "<div class='results-selector'>";
echo "Results per page: ". 
    CHtml::dropDownList('gecgPageSize',$gecgPageSize,array(10=>10,20=>20,50=>50,100=>100),array(
        'onchange'=>"
            $.fn.yiiGridView.update('gecg',{ data:{gecgPageSize: $(this).val() }});
        ",
    ));
echo "</div>";

$this->widget('zii.widgets.grid.CGridView', array(
   'id'=>'gecg',
   'filter'=>$model,
   'dataProvider'=>$dataProvider, 
   'columns'=>$columns,
));
?>

考え?

4

2 に答える 2

0

あなたが書いたものがすべて揃っているかどうかはわかりませんが、2デプスロードCGridViewのポケットベルが機能すると確信していますか?

Yiiは、 jQueryの.on()メソッドを使用して、イベントハンドラーをページャーのボタン、並べ替えボタン、CButtonColumnクラスのボタンにアタッチします。パラメータを指定すると、この呼び出しの時点で存在するものと存在しないものの両方について、jQuery要素メソッドの一致するすべての子孫に対してイベントがトリガーされます。selectoron()

documentYiiは、ページ上に常に存在する(イベントをトリガーできるようにするために存在する必要がある)要素にハンドラーをアタッチします。CGridViewinitメソッドの例としてそれを見ることができますzii/widgets/assets/gridview/jquery.yiigridview.js

settings.updateSelector = settings.updateSelector
    .replace('{page}', pagerSelector)
    .replace('{sort}', sortSelector);

gridSettings[id] = settings;

if (settings.ajaxUpdate.length > 0) {
    $(document).on('click.yiiGridView', settings.updateSelector, function () {
        // Check to see if History.js is enabled for our Browser
        if (settings.enableHistory && window.History.enabled) {
            // ...
        } else {
            $('#' + id).yiiGridView('update', {url: $(this).attr('href')});
        }
        return false;
    });
}

したがってCGridView、ajaxリクエストでウィジェットをレンダリングすると、ページャー、並べ替えなどのすべてのイベントハンドラーはdocument、ajaxページの部分的にレンダリングされた要素にアタッチされますが、新しくロードされた要素が属するメインページの要素にはアタッチされないと思います。inlineSearchajaxを介してビューをロードする場合、おそらく同じことがドロップダウンリストでも発生します。

そのため、私が見ることができるように、すべてのイベントハンドラーはdocument、最初にページをロードするメインの非ajaxビューの要素にアタッチする必要があります。

于 2012-11-15T15:38:16.043 に答える
0

解決策:多くの混乱の後、各inlineSearchビューの最後にあるウィンドウ変数に手動でsettings+を格納し、ページセレクターごとのアイテムが変更されたときにウィンドウからそれらを取得することにしました。$.fn.yiiGridView

これは非常に洗練されたソリューションではありませんが(特に、ページャーが正常に機能していたため、複数の$ .fn.yiiGridViewインスタンスが浮かんでいます)、まあまあです。それは機能し、私はまだYiiの初心者ですが、私の調査から、複数のajaxがロードされたウィジェットにいくつかの未解決の問題があることがわかります。

inlineSearchビューのページ要素ごとの新しい結果:

echo "<div class='results-selector'>";
echo "Results per page: ". 
    CHtml::dropDownList('gecgPageSize',$gecgPageSize,array(10=>10,20=>20,50=>50,100=>100),array(
        'onchange'=>"
            $.fn.yiiGridView=window.gecgGridView; // necessary in case other other ajax load doesn't have the yiigridview js
            $.fn.yiiGridView.settings['gecg']=window.gecgGridSettings; // because it will have been clobbered by other ajax grid load
            $.fn.yiiGridView.update('gecg',{ data:{ gecgPageSize: $(this).val() }});
        ",
    ));
echo "</div>";

inlineSearchビューの最後に、これは保存settingsされますwindow

<script type='text/javascript'>
$(function(){ 
    window.gecgGridView=$.fn.yiiGridView;
    window.gecgGridSettings={
                            ajaxUpdate:["gecg"],
                            ajaxVar:"ajax",
                            pagerClass:"pager",
                            filterClass:"filters",
                            loadingClass:"grid-view-loading",
                            pageVar:"GeneExpressionCufflinksGene_page",
                            pagerClass:"GeneExpressionCufflinksGene_page",
                            selectableRows:1,
                            tableClass:"items",
                            updateSelector:"#gecg .pager a, #gecg .items thead th a",
                            afterAjaxUpdate:function(){}
                          };
})
</script>
于 2012-11-16T15:21:41.263 に答える