2014-11-08 82 views
2

我試圖在Require應用程序中使用c3.jsd3.js。我application.html.erb看起來如下:Rails,RequireJS,C3.js:c3未定義

application.html.erb

<!DOCTYPE html> 
<html> 
    <head> 
    <title><%= yield(:title) %></title> 
    <%= stylesheet_link_tag "application", :media => "all" %> 
    <%= stylesheet_link_tag params[:controller] %> 
    <%= csrf_meta_tags %> 
    </head> 
    <body> 
    <div> 
     <%= yield %> 
    </div> 
    <%= requirejs_include_tag params[:controller] %> 
    </body> 
</html> 

電流調節器是instructor和得到成功加載該文件,instructor.js如下所示:

instructor.js

require(["jquery", "modules/d3.min", "modules/c3.min"], function($, d3, c3) 
{ 
    console.log(d3); 
    console.log(c3); 
}); 

現在,在運行應用程序時沒有錯誤,但未定義c3。這裏是控制檯輸出:

控制檯

Object {version: "3.4.13", ascending: function, descending: function, min: function, max:function…} // instructors.js:3 
undefined // instructors.js:4 

所以d3.js被載入罰款,但c3.js是不確定的。我不明白這裏發生了什麼問題。請幫忙。

謝謝!

回答

1

當c3正在初始化時,它正在全局範圍內查找d3,如果它在那裏找不到它,它將嘗試使用d3的命名路徑以require進行解析。如果您使用require同時加載d3和c3,則此依賴關係可能會創建爭用條件。

c3.js

function ChartInternal(api) { 
    var $$ = this; 
    $$.d3 = window.d3 ? window.d3 : typeof require !== 'undefined' ? require("d3") : undefined; 
    ... 
}  

如果您設置您需要的配置設置爲D3這應該解決該問題的明確路徑。

代碼

requirejs.config({ 
    paths: { 
     "d3": "modules/d3.min", 
     "c3": "modules/c3.min" 
    } 
}); 

require(["d3", "c3"], function (d3, c3) { 
    console.log(d3); 
    console.log(c3); 
}); 

控制檯

Object {version: "3.5.6", behavior: Object, event: null, ns: Object, time: Object…} 
Object {version: "0.4.10", chart: Object}