Я использую модальный бутстрап для своих форм crud, и я также использую расширение yii2-ajaxcrud, которое расширяет генератор gii для одной страницы crud.Yii2, Javascript dont work only in modal
Все работает правильно, экономя модели, проверяя и т. Д. Однако, я пытаюсь использовать плагин javascript: (липкий набор от Leafo), чтобы наклеить мои кнопки действий вверху. Бывает, что, когда я получить доступ к своему «создать» вид в модальных возникает следующая ошибка:
"Uncaught TypeError: $ (...) stick_in_parent is not a function."
С точки зрения индекса I доступа к «создать» вид. Когда модальный открывается, я вижу в хромовом инспекторе инъекцию jquery и плагина. Более того, с расширением ajax crud я также могу получить доступ к представлениям, созданным прямым URL-адресом, и, таким образом, плагин-плагин работает. Ошибка доступа к представлению в модальном режиме.
Что может быть? Ниже приведен мой основной код.
//namespace app\modules\crm\controllers
public function actionCreate()
{
$request = Yii::$app->request;
$model = new Classes();
if($request->isAjax){
/*
* Process for ajax request
*/
Yii::$app->response->format = Response::FORMAT_JSON;
if($request->isGet){
return [
'title'=> "Create new Classes",
'content'=>$this->renderAjax('create', [
'model' => $model,
]),
'footer'=> Html::button('Close',['class'=>'btn btn-default pull-left','data-dismiss'=>"modal"]).
Html::button('Save',['class'=>'btn btn-primary','type'=>"submit"])
];
}else if($model->load($request->post()) && $model->save()){
return [
'forceReload'=>$this->htmlTableContainerId ,
'title'=> "Create new Classes",
'content'=>'<span class="text-success">Create Classes success</span>',
'footer'=> Html::button('Close',['class'=>'btn btn-default pull-left','data-dismiss'=>"modal"]).
Html::a('Create More',['create'],['class'=>'btn btn-primary','role'=>'modal-remote'])
];
}else{
return [
'title'=> "Create new Classes",
'content'=>$this->renderAjax('create', [
'model' => $model,
]),
'footer'=> Html::button('Close',['class'=>'btn btn-default pull-left','data-dismiss'=>"modal"]).
Html::button('Save',['class'=>'btn btn-primary','type'=>"submit"])
];
}
}else{
/*
* Process for non-ajax request
*/
if ($model->load($request->post()) && $model->save()) {
return $this->redirect(['view', 'id' => $model->ID]);
} else {
return $this->render('create', [
'model' => $model,
]);
}
}
}
Вид
// create view
<div class="panel-body" style="height: 600px">
<div class="classes-create">
<?= $this->render('_form', [
'model' => $model,
]) ?>
</div>
</div>
$this->registerJsFile('http://leafo.net/sticky-kit/src/sticky-kit.js', ['depends' => [\yii\web\JqueryAsset::className()]]);
$this->registerJs("$('.panel-heading').stick_in_parent();");
EDIT
Фактический HTML generetade в представлении, когда модальный открыт. Я попытался удалить дублированное включение jquery (в модальном и индексированном), я получил его (с Yii :: $ app-> assetManager-> bundles = ['yii \ web \ JqueryAsset' => false,], ...), но ошибка сохраняется, поэтому я сохраняю ее.
<html lang="pt-BR">
<body>
// omitted content, body content of index view, with gridview etc.
<div id="ajaxCrudModal" class="fade modal in" role="dialog" tabindex="-1" style="display: block;">
<div class="modal-dialog ">
<div class="modal-content">
<div class="modal-body"><div class="panel">
<div class="panel-body" style="height: 600px">
// omitted content
</div>
</div>
<script src="/yii2/basic/assets/32e507bc/jquery.js"></script>
<script src="/yii2/basic/assets/9f23c46b/yii.js"></script>
<script src="/yii2/basic/assets/9f23c46b/yii.validation.js"></script>
<script src="/yii2/basic/assets/9f23c46b/yii.activeForm.js"></script>
<script src="http://leafo.net/sticky-kit/src/sticky-kit.js"></script>
<script type="text/javascript">
//$('body').on('load', function(){
$('.panel-heading').stick_in_parent();
//});
</script>
</div>
<div class="modal-footer"></div>
</div>
</div>
</div>
<script src="/yii2/basic/assets/32e507bc/jquery.js"></script>
<script src="/yii2/basic/assets/9f23c46b/yii.js"></script>
<script src="/yii2/basic/assets/fb64637f/js/bootstrap.js"></script>
<script src="/yii2/basic/assets/9f23c46b/yii.validation.js"></script>
<script src="/yii2/basic/assets/9f23c46b/yii.activeForm.js"></script>
<script src="/yii2/basic/assets/28255cf7/dist/js/bootstrap-dialog.js"></script>
<script src="/yii2/basic/assets/9f23c46b/yii.gridView.js"></script>
<script src="/yii2/basic/assets/75fbd502/js/kv-grid-action.js"></script>
<script src="/yii2/basic/assets/8d08c7cb/jquery.pjax.js"></script>
</body></html>
Похоже, что у вас может быть проблема с заказом? Вы пробовали зарегистрироваться в обоих сценариях? Или, по крайней мере, используя: '$ this-> registerJs (" $ ('. Panel-heading'). Stick_in_parent(); ", View :: POS_END);' (http://www.yiiframework.com/doc -2.0/yii-web-view.html # registerJs() - detail) –
Привет, спасибо за подсказку, я пробовал, но никакого эффекта. Порядок выглядит отлично, я редактировал вопрос, включая заказ в представлении. – Johny
Я думаю, что проблема заключается в том, что вы не можете гарантировать, что stick_in_parents будет запущен после загрузки lib. Тем более, что он обслуживается удаленно. Вероятно, вы должны использовать '.on ('event', ...)', а в вашем аякс-вызове 'success' запускается это событие. –