yii2,使用新数据部分渲染视图

yii2 和 PHP 的新手,在这里遇到了问题。
基于这篇文章和这篇文章,我尝试重新创建 AJAX 调用。
现在,使用 Kartik SwitchInput 小部件,我至少尝试将值输入控制器,然后将其返回到索引页面上的另一个位置。

这是视图中的内容

...

<?= GridView::widget([

    'dataProvider' => $customers,

    'columns' => [

        ...

        [

            'label' => 'Status',

            'format' => 'raw',

            'attribute' => 'status',

            'value' => function($models){

                return SwitchInput::widget([

                    'name' => $models->id,

                    'value' => $models->status,

                    'pluginEvents' => [

                        'switchChange.bootstrapSwitch' => 'function(e) { 

                            $.ajax({

                                method: "POST",

                                url: "'.Url::to(['update-status']).'",

                                data: { "status": e.currentTarget.checked, "id": e.currentTarget.name },

                                error:function(res){

                                    console.log(res.responseText);

                                }

                            })

                            console.log(`${e.currentTarget.checked}  ${e.currentTarget.name}`);

                        }'

                    ]

...

这是控制器:


class CustomerController extends Controller{

    public function actionIndex(){


        $customers = new ActiveDataProvider([

            'query' => Customer::find()

        ]);


        $models = $customers->getModels();


        return $this->render('index', [ 

            'customers' => $customers,

            'models' => $models

        ]);

    }


    public function actionUpdateStatus(){

        $status = Yii::$app->request->post('status');

        $id = Yii::$app->request->post('id');


        return $this->renderPartial('index', [

            'status' => $status,

            'id' => $id

        ]);

    }

}

每当我拨动开关时,它都会返回 500 内部错误。Console.logging 它显示:$customers 未定义。

据我所知,每当我调用 actionUpdateStatus 时,Yii 都会完全重新呈现视图,并尝试找到不在 UpdateStatus 中的 $customers。

那么,如何将开关数据分别返回到同一视图中呢?


GCT1015
浏览 106回答 1
1回答

ABOUTYOU

我没有指定一件事是重新加载 gridview,这不是那里的要求,但可以使用$.pjax.您需要注意的几件事updateStatus根据您的要求,您不需要任何视图来执行操作。您只需要将一些状态代码返回到您在 gridView 中用于切换输入的 ajax 调用,并刷新您的 gridview 以加载新的更新状态。在 ajax 成功回调函数中检查状态代码是否正常,那么您应该刷新 gridview 而不是使用 render partial。你没有更新任何内容updateStatus?你需要切换状态所以将您的操作更改为以下内容public function actionUpdateStatus(){    try {        $status = Yii::$app->request->post('status');        $id = Yii::$app->request->post('id');        $model = Customer::findOne($id);        $model->status=$status;        if(!$model->save()){           throw new Exception(implode("\n",\yii\helpers\ArrayHelper::getColumn($model->errors,'0'));        }        return $this->asJson(['success' => true]);    } catch (Exception $e) {        return $this->asJson(['success' => false, 'message' => $e->getMessage()]);    }}确保已将 GridView 包装在 Pjax 开始和结束内,并将 an 添加id到 Pjax 小部件<?php     Pjax::begin(['id'=>'pjax-container']);    echo GridView::widget([    'dataProvider' => $customers,    'columns' => [    .......    ]);    Pjax::end(); ?>您对以下内容的 ajax 调用'switchChange.bootstrapSwitch' => 'function(e) {    $.ajax({        method: "POST",        url: "'.Url::to(['update-status']).'",        dataType:'json',        data: { "status": e.currentTarget.checked, "id": e.currentTarget.name },        success:function(data){             if(data.success){                  $.pjax({container: "#pjax-container"});             }else{                  console.log(data.message);             }        },        error:function(res){            console.log(res.responseText);        }    });}'
打开App,查看更多内容
随时随地看视频慕课网APP