2014-11-08 58 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}