Yii renderPartial с помощью внешнего JavaScript

0

У меня есть представление страницы, которое делает вызов ajax и обновляет содержимое страницы с помощью renderPartial.

Итак, page.php → _pagePartial.php (обновление ajax)

в page.php Я хочу включать файлы javascript один раз, а затем изменения DOM применяются после рендеринга ajax. Не имеет смысла загружать эту загрузку JS файла при каждом обновлении AJAX.

Например, в page.php

$baseUrl  = Yii::app()->baseUrl;
$basePath = Yii::app()->basePath;
$cs       = Yii::app()->getClientScript();
$cs->registerScriptFile($baseUrl . '/js/jquery.ui.js'); // load one time! 

затем в pagePartial.php

    // every ajax partial load
    $('#sortable-list-left').sortable({
                connectWith:'.productEntryCol',
                placeholder: 'ui-state-highlight',
                update: function(event, ui) {
                    var sortOrderLeft = getSortOrder('sortable-list-left');
                    var sortOrderRight = getSortOrder('sortable-list-right');
                    var projectId =  '" . $project_id . "';
                    $.ajax({
                        data: { left: sortOrderLeft, right : sortOrderRight,  id : projectId},
                        url: '/project/ajaxUpdateOrder',
                        type: 'POST',
                        success: function(response){
                          // process JSON response
                          var obj = jQuery.parseJSON(response);
                        }
                    });
                 }
            });

Проблема заключается в том, что после _pagePartial нагрузки через AJAX, он не может использовать метод.sortable().

Каков правильный способ справиться с этим?

благодаря

Теги:
yii
renderpartial

2 ответа

2
Лучший ответ

Способ, которым я обрабатываю это, находится на основном представлении на $.load или $.ajax или что бы то ни было, добавьте свой код в функцию успеха.

Так, например:

$.get('_pagePartial.php', null, function(html) {
    $('#result').html(html);
    $('#sortable-list-left').sortable({
        //all your sortable code
    });
});

Другой вариант - добавить ваш javascript на загруженной странице ajax ('_pagePartial.php') в такую функцию:

function firejs() {
    $('#sortable-list-left').sortable({
        //all your sortable code
    });
}

Затем при успешном вызове ajax на вашем основном представлении ('page.php') просто добавьте следующее:

$.get('_pagePartial.php', null, function(html) {
    $('#result').html(html);
    firejs();
});

Вы можете привязываться к объекту, пока он не будет добавлен в DOM, и он не будет добавлен в DOM до тех пор, пока вызов ajax не завершится успешно, и результат не будет добавлен в DOM.

Кроме того, только FYI yii имеет встроенный jqueryui, вы можете просто сказать:

Yii::app()->clientScript->registerCoreScript('jquery.ui');
Yii::app()->clientScript->registerCoreScript('jquery');
  • 0
    Круто, я проверю это.
  • 0
    Кажется, загружается и работает с большинством вещей, но перетаскиваемый элемент пользовательского интерфейса JQuery работает только один раз на загрузку страницы, а затем снова не работает, в отличие от фактического помещения JS в частичное представление, которое работает все время.
Показать ещё 14 комментариев
1

Для таких людей, как я, у кого такая же проблема, даже с:

Yii::app()->clientscript->scriptMap['jquery.js'] = false;

в renderPartial и все еще не работает. Я нашел другое решение, более эффективным, я думаю. Самое простое решение - установить 4-й параметр renderPartial.

RenderPartial-деталь

public string renderPartial(string $view, array $data=NULL, boolean $return=false, boolean $processOutput=false)

Речь идет о processOutput. Если вы поместите его в true, то JQuery будет загружен в ваш рендер Partial.

Надеюсь, это поможет кому-то...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню