У меня есть представление страницы, которое делает вызов 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().
Каков правильный способ справиться с этим?
благодаря
Способ, которым я обрабатываю это, находится на основном представлении на $.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');
Для таких людей, как я, у кого такая же проблема, даже с:
Yii::app()->clientscript->scriptMap['jquery.js'] = false;
в renderPartial и все еще не работает. Я нашел другое решение, более эффективным, я думаю. Самое простое решение - установить 4-й параметр renderPartial.
public string renderPartial(string $view, array $data=NULL, boolean $return=false, boolean $processOutput=false)
Речь идет о processOutput. Если вы поместите его в true, то JQuery будет загружен в ваш рендер Partial.
Надеюсь, это поможет кому-то...