javascript - rails : Restricting pure javascript in the asset pipeline to specific views

标签 javascript ruby-on-rails ruby-on-rails-3 amcharts

我正在尝试将我的 AMChart 纯 javascript 从我的 View 中取出并放入到我的 Controller 的 asset/javascripts/中的 .js 文件中,正如 Rails 所喜欢的那样。

我在两个单独的 View 上有两个单独的图表,每个图表都有不同的配置和数据源。

我的问题是,当访问一个 View 时,我收到一个 JavaScript 错误,指出包含另一 View 的图表数据的变量“未定义” - 此错误下方的所有 JavaScript 都会中止。

AMChart JavaScript 只是纯 JavaScript(无 jquery),在我的 Controller 的两个图表的 .js 文件中看起来像这样:

/// Radar Chart for First View

  var chart;

  AmCharts.ready(function () {
    // RADAR CHART
    chart = new AmCharts.AmRadarChart();
    chart.dataProvider = chartData_radar1;  // <- data variable
    chart.categoryField = "criteria";
    chart.startDuration = 1;
    chart.startEffect = ">";
    chart.sequencedAnimation = true;

    // VALUE AXIS
    var valueAxis = new AmCharts.ValueAxis();
    valueAxis.gridType = "circles";
    valueAxis.fillAlpha = 0.02;
    valueAxis.fillColor = "#000000"
    valueAxis.axisAlpha = 0.1;
    valueAxis.gridAlpha = 0.1;
    valueAxis.fontWeight = "bold"
    valueAxis.minimum = 0;
    valueAxis.maximum = 10;
    chart.addValueAxis(valueAxis);

    // GRAPH
    var graph = new AmCharts.AmGraph();
    graph.lineColor = "#98cdff"
    graph.fillAlphas = 0.4;
    graph.bullet = "round"
    graph.valueField = "score"
    graph.balloonText = "[[category]]: [[value]]/10"
    chart.addGraph(graph);

    // Balloon Settings
    var balloon = chart.balloon;
    balloon.adjustBorderColor = true;
    balloon.color = "#000000";
    balloon.cornerRadius = 5;
    balloon.fillColor = "#000000";
    balloon.fillAlpha = 0.7
    balloon.color = "#FFFFFF"

    // WRITE
    chart.write("chartdiv");
  });



/// Radar Chart for Second View

  var chart;

  // Draw AM Radar Chart
  AmCharts.ready(function () {
    // RADAR CHART
    chart = new AmCharts.AmRadarChart();
    chart.dataProvider = chartData_radar2;  // <- data variable
    chart.categoryField = "criteria";
    chart.startDuration = 0.3;
    chart.startEffect = ">";
    chart.sequencedAnimation = true;

    // GRAPH - FIRST 5
    var graph = new AmCharts.AmGraph();
    graph.title = "First 5";
    graph.lineColor = "#bdd523"
    graph.fillAlphas = 0.2;
    graph.bullet = "round"
    graph.valueField = "first5"
    graph.balloonText = "[[category]]: [[value]]/10"
    chart.addGraph(graph);

    // GRAPH - LAST 5
    var graph = new AmCharts.AmGraph();
    graph.title = "Last 5";
    graph.lineColor = "#98cdff"
    graph.fillAlphas = 0.2;
    graph.bullet = "round"
    graph.valueField = "last5"
    graph.balloonText = "[[category]]: [[value]]/10"
    chart.addGraph(graph);

    // VALUE AXIS
    var valueAxis = new AmCharts.ValueAxis();
    valueAxis.gridType = "circles";
    valueAxis.fillAlpha = 0.02;
    valueAxis.fillColor = "#000000"
    valueAxis.axisAlpha = 0.1;
    valueAxis.gridAlpha = 0.1;
    valueAxis.fontWeight = "bold"
    valueAxis.minimum = 0;
    valueAxis.maximum = 10;
    chart.addValueAxis(valueAxis);

    // Balloon Settings
    var balloon = chart.balloon;
    balloon.adjustBorderColor = true;
    balloon.color = "#000000";
    balloon.cornerRadius = 5;
    balloon.fillColor = "#000000";
    balloon.fillAlpha = 0.7
    balloon.color = "#FFFFFF"

    // Legend Settings
    var legend = new AmCharts.AmLegend();
    legend.position = "bottom";
    legend.align = "center";
    legend.markerType = "square";
    legend.rollOverGraphAlpha = 0;
    legend.horizontalGap = 5;
    legend.valueWidth = 5;
    legend.switchable = false;
    chart.addLegend(legend);

    // WRITE
    chart.write("chart_radar");
  });

(由于缺乏更好的方法将数据从我的模型获取到 js 方法中,我在 View 中定义了“chartData_radar1”或“chartData_radar2”(例如在上面的第 7 行中调用))

:javascript
  var chartData_radar1 = #{Case.chart_analysis_radar(current_user)};

我并不是在寻找一种黑客/解决方法来让它工作,而是更多地了解Rails如何在 Assets 管道中处理像这样的纯javascript?有没有一种好方法可以根据 View 只加载一个雷达的 JavaScript,而不必将其放入 View 本身?我知道如果你使用 Jquery 选择器,你可以有选择地加载 javascript 的部分,我可以例如以某种方式将这一切打包到 jquery 选择器中?

任何帮助将不胜感激!

最佳答案

尽管这个问题已经很老了,但我会尝试回答 - 可能会对某人有所帮助。

本质上,您想要做的就是通过全局变量将数据从 Rails View 或 Controller 发送到 Javascript:

:javascript
    window.chartData = #{JSON.stringify(@your_data)};

然后在 assets/javascripts/ 中的任何 JS 文件中,您都可以访问此变量。但是,请确保您在页面加载后访问它(因此请使用 jQuery 的 $( document ).ready( function() { ... } )window.onload = 。 ..(如果您不使用 jQuery):

$( document ).ready( function() {
    ...
    var chart = new AmCharts.AmRadarChart();
    chart.dataProvider = window.chartData;
    ...
});

window.onload = function () {
    ...
    var chart = new AmCharts.AmRadarChart();
    chart.dataProvider = window.chartData;
    ...
};

您还可以更进一步。您可以将这样的内容直接添加到您的布局中:

:javascript
    window.config = #{JSON.stringify(@js_config || {})};

然后在任何 Controller 方法中,您需要做的就是:

@js_config[:chart_data] = some_chart_data

现在您可以在任何 JavaScript 中访问它:

console.log(window.config.chart_data)

在这种情况下,是否需要等待页面加载取决于您是否在 head 或 body 中定义了配置变量。

关于javascript - rails : Restricting pure javascript in the asset pipeline to specific views,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12288852/

相关文章:

javascript - Eloquent Javascript 中的练习 4.4 -- startsWith() 和 .slice

ruby-on-rails - 从父应用程序重新打开 Rails 3 引擎类

ruby-on-rails - Rails 模型定义

ruby-on-rails - Rails - 电子邮件确认 - RecordNotFound 错误

javascript - 如何捕获 saveChanges 上的错误 - Google 应用制作工具

javascript - 如何正确测试 Vuex?

ruby-on-rails - 如何测试 rails 模型的 after_initialize 回调?

ruby - ActiveSupport::Concern 与 append_features

javascript - 剑道网格中总和列的总和

ruby-on-rails - RoR Net::HTTP 发布错误未定义方法 `bytesize'