【问题标题】:How can I integrate FusionChart in my SPA application developed using Durandal and Knockout?如何将 FusionChart 集成到使用 Durandal 和 Knockout 开发的 SPA 应用程序中?
【发布时间】:2013-08-05 22:26:07
【问题描述】:

如何将 FusionChart 集成到使用 MVVM 架构、Durandal 和 Knockout.js 开发的 SPA 应用程序中?我创建了一个带有硬编码数据的简单 HTML 文件,其中的图表运行良好,但我无法弄清楚如何将这段代码嵌入到我的 SPA 应用程序中。

我正在分享一些细节:

我在我的 HTML 文件中添加了以下 Js 文件:

<script type="text/javascript" src="./FusionCharts.js"></script>
<script type="text/javascript" src="./jquery-1.9.1.min.js"></script>
<script type="text/javascript" src="./lib.js"></script>

我的融合图渲染成功的HTML文件代码如下:

<div id="chartdiv" align="center">Chart will load here</div>
<script type="text/javascript">
    var chart = new FusionCharts("Column3D", "myChartId", "300", "200");
    chart.setXMLData("<chart animation='0' caption='Aging' numberPrefix='$'      showBorder='1'>" +
                            "<set label='Current' value='24000' color='00FF00' />" +
                            "<set label='30+' value='19600' color='0000FF' />" +
                            "<set label='60+' value='15700' color='FFFF00'/>" +
                            "<set label='90+' value='14400' color='FF0000' />" +
                            "<styles>" +
                            "<definition>" +
                            "<style name='myCaptionFont' type='font' align='right'/>" +
                            "</definition>" +
                            "<application>" +
                            "<apply toObject='Caption' styles='myCaptionFont' />" +
                            "</application>" +
                            "</styles> " +
                            "</chart>");
    chart.render("chartdiv");
</script> 

我无法弄清楚我的 ViewModel.js 和 view.html 文件中的代码应该是什么来渲染 FusionChart。

请帮忙。

【问题讨论】:

    标签: mvvm knockout.js durandal fusioncharts


    【解决方案1】:

    我开发了一个在 DurandalJS 中包含 FusionCharts 的工作演示。只需将项目复制到网络服务器并访问应用程序即可。

    https://github.com/bhargav3/fcdurandal

    首先要包含 fusioncharts.js,这可以使用 requirejs 或直接将其添加到索引文件中来完成。为了避免创建重复的图表,我们将检查 FusionCharts('myChartId') 是否存在并避免重绘。

    你的 viewmodel 看起来像这样,

    define(['durandal/http', 'durandal/app'], function() {
    return {
        displayText: 'FusionCharts in a SPA app!',
        viewAttached: function(view) {
    
            if (typeof FusionCharts('myChartId') === 'undefined') {
                $('#binder').append('<div id="chartContainer"></div>');
                var myChart = new FusionCharts("Column3D", "myChartId", "400", "300", "0");
                myChart.setXMLData("<chart animation='0' caption='Aging' numberPrefix='$'      showBorder='1'>" +
                        "<set label='Current' value='24000' color='00FF00' />" +
                        "<set label='30+' value='19600' color='0000FF' />" +
                        "<set label='60+' value='15700' color='FFFF00'/>" +
                        "<set label='90+' value='14400' color='FF0000' />" +
                        "</chart>");
                myChart.render("chartContainer");
    
            }
        }
    };
    

    });

    您的视图会是什么样子

    <h2 data-bind="html:displayText"></h2>
    <div id="binder"></div>  
    

    main.js 是引导文件,您可以在其中添加路由器(用于导航)。

    【讨论】:

      【解决方案2】:

      如果您的 JavaScript 文件是通过 index.html 上的脚本标签添加的,那么 Fusion Charts 应该可以在您的视图模型中使用。如果出于某种原因您不希望全局加载它,那么有一种方法可以利用 require.js 动态加载到视图模型的范围内。为了简单地演示 viewAttached 的使用,我没有在下面的视图模型示例中包含它。

      viewAttached (http://durandaljs.com/documentation/Hooking-Lifecycle-Callbacks/) 似乎是生命周期中调用的最后一个方法。如文档所示,该方法指示“视图附加到父 DOM 节点”的时间。这应该允许您在绑定发生后根据需要操作视图。另见:http://durandaljs.com/documentation/Interacting-with-the-DOM/

      以下是在视图模型中使用 viewAttached 的示例:

      define(function() {
          var activate = function() {
      
          };
      
          var viewAttached = function() {
              var chart = new FusionCharts("Column3D", "myChartId", "300", "200");
              chart.setXMLData("<chart animation='0' caption='Aging' numberPrefix='$'   showBorder='1'>" +
                              "<set label='Current' value='24000' color='00FF00' />" +
                              "<set label='30+' value='19600' color='0000FF' />" +
                              "<set label='60+' value='15700' color='FFFF00'/>" +
                              "<set label='90+' value='14400' color='FF0000' />" +
                              "<styles>" +
                              "<definition>" +
                              "<style name='myCaptionFont' type='font' align='right'/>" +
                              "</definition>" +
                              "<application>" +
                              "<apply toObject='Caption' styles='myCaptionFont' />" +
                              "</application>" +
                              "</styles> " +
                              "</chart>");
              chart.render("chartdiv");            
          };
      
          return {
              activate: activate,
              viewAttached: viewAttached
          };
      };
      

      最后,你的视图应该包含:

      <div id="chartdiv" align="center">Chart will load here</div>
      

      【讨论】:

        猜你喜欢
        • 2012-11-10
        • 1970-01-01
        • 2013-03-02
        • 2013-08-31
        • 1970-01-01
        • 1970-01-01
        • 2015-11-09
        • 2013-08-21
        • 2013-06-25
        相关资源
        最近更新 更多