0

我有一个页面视图,它进行 ajax 调用并使用 renderPartial 更新页面的内容。

所以 page.php -> _pagePartial.php(ajax 更新)

在 page.php 中,我想包含一次 javascript 文件,然后在 ajax 渲染发生后应用 DOM 修改。在每次 AJAX 刷新时加载这个 JS 文件是没有意义的。

例如在 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);
                        }
                    });
                 }
            });

问题是在通过 AJAX 加载 _pagePartial 之后,它不能使用 .sortable() 方法。

处理这个问题的正确方法是什么?

谢谢

4

2 回答 2

2

我处理这个问题的方法是在主视图上$.load或者$.ajax或者不管它是什么,在成功函数上添加你的代码。

例如:

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

另一种选择是将您的 ajax 加载页面('_pagePartial.php')上的 javascript 添加到如下函数中:

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

然后在主视图('page.php')上成功调用 ajax 时,只需添加以下内容:

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

您可以绑定到一个对象,直到它被添加到 DOM 中,并且在 ajax 调用成功完成并将结果添加到 DOM 之前,它不会被添加到 DOM 中。

也只是一个 FYI yii 内置了 jqueryui 你可以简单地说:

Yii::app()->clientScript->registerCoreScript('jquery.ui');
Yii::app()->clientScript->registerCoreScript('jquery');
于 2013-10-21T18:48:18.617 回答
1

对于像我这样有同样问题的人,即使是:

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

在 renderPartial 中仍然无法正常工作。我找到了另一种解决方案,我认为更有效。最简单的解决方案是设置 renderPartial 的第 4 个参数。

渲染部分细节

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

它是关于processOutput 的。如果你把它设置为 true,那么 Jquery 将被加载到你的渲染部分中。

希望这会帮助某人...

于 2015-07-23T14:39:01.680 回答