Highcharts、Yii 和正文内容重新加载

Posted

技术标签:

【中文标题】Highcharts、Yii 和正文内容重新加载【英文标题】:Highcharts, Yii and body content reloading 【发布时间】:2014-08-20 21:50:56 【问题描述】:

我有一个在 CListView 和 Highcharts 图形中呈现一些数据的视图。

请注意CListView 的寻呼机的工作方式如下:它向服务器请求“新页面”,服务器呈现页面的全部内容并将其发送到CListView。然后将正文替换为正在发送的内容,如下所示:$('body').html(rendered_html_response)

我也有一个模仿这种行为的dropDownList。这是代码:

<?php
    echo CHtml::dropDownList('usage', 'cg', array(
        'd'=>'Daily',
        'm'=>'Monhly'
    ), array(
        'ajax'=>array(
            'type'=>'POST',
            'url'=>$this->createUrl('admin/user', array(
                'id'=>$user->id)
            ),
            'update'=>'body',
            'data'=>array('cg'=>'js:$(this).val()'), 
            'options'=>array(
                Yii::app()->session['cg']=>array(
                    'selected'=>true
                )
            )
        )
    ));
?>

总之,有问题。当我使用CListView 时,一切正常(例如:刷新页面内容而不重新加载页面,图表和数据正确呈现等...),但是当我使用@987654328 选择某些内容时@,服务器渲染回复,发送给客户端,客户端开始替换body的内容,但是我得到这个错误:http://www.highcharts.com/errors/16

我尝试以这种方式禁用highcharts.src.js

public function beforeAction()
    if(Yii::app()->request->isAjaxRequest)
        Yii::app()->clientScript->scriptMap['highcharts.src.js'] = false;
    
    return true;

然后我得到典型的undefined javascript 错误(意味着 something 正在尝试使用未定义的Highcharts)。

问题出在哪里,我该如何解决?

【问题讨论】:

请编辑您的帖子并添加所有相关代码sn-ps,例如(主视图、部分视图和控制器) 【参考方案1】:
//init
$('#container').highcharts();
//select onchange
$('#container').highcharts().destroy();

【讨论】:

这并不能解决问题。我尝试将该代码放在多个地方。发送请求之前/之后,替换 DOM 之前/之后以及插入新图表之前。【参考方案2】:

按照错误链接所述

页面中已经定义了Highcharts

此错误在第二次在同一页面中加载 Highcharts 或 Highstock 时发生,因此已经定义了 Highcharts 命名空间。请记住,Highcharts.Chart 的构造函数和 Highcharts 的所有功能都包含在 Highstock 中,因此如果您将 Chart 和 StockChart 组合运行,则只需加载 highstock.js 文件即可。

您正在加载 highcharts javascript 两次。你可以试试

a) 在第一次加载时启用 highcharts,然后在下一次加载时禁用它,例如检查是否 ajax

b) 使用自定义 javascript 检查是否已加载 highcharts,如 this blog post

c) 使用 NLSClientScript extension 为您处理 js 和 css 加载

我建议你使用最后一个。我被这个问题咬了几次,直到我发现它。它消除了单独列出每个 javascript 函数/文件的需要。

编辑

您可以编辑代码以使用相同的 update 函数,而不是编辑 listview js:

<?php
    echo CHtml::dropDownList('usage', 'cg', array(
        'd'=>'Daily',
        'm'=>'Monhly'
    ), array(
        'onChange'=>'$.fn.yiiListView.update("your-list-id", 
            data: "usage":$(this).val(),
            type: "POST"
        );'
    ));
?>

【讨论】:

AFAIK 我正在我的beforeAction 代码中执行您的a 建议,对吧?那也不行。 没有。您的 beforeAction 首先阻止了 highcharts 加载,因此出现错误。 不,我的beforeAction仅在是 AJAX 请求时才阻止加载脚本(因此是第二次)。 是的,我的错。我没有完全阅读你的评论。可能是因为您要替换 bodyCListView 仅替换它的 html 元素而不是正文。 再次,AFAIK CListView 请求整个正文并替换整个正文。至少这是我在请求响应中看到的。

以上是关于Highcharts、Yii 和正文内容重新加载的主要内容,如果未能解决你的问题,请参考以下文章

在Yii的HighCharts更新

利用Ajax提升网页渲染速度——以Highcharts为例

在使用pjax重新加载gridview后,在gridview上的Yii2模态表单更新没有显示

highcharts error #16

Highcharts异步服务器加载多个系列

无法在重新加载页面上获取 /login Angular 8 - 拒绝加载图像“/favicon.ico”,因为它违反了以下内容安全策略