在呈现部分时执行JavaScript?

在呈现部分时执行JavaScript?,javascript,ruby-on-rails,ruby,Javascript,Ruby On Rails,Ruby,我有两个部分,一个叫做_contents.html.erb,它加载D3.js的一些标记,另一个叫做_show.js.erb,它加载JavaScript与_contents中的标记交互。但是,JavaScript只在页面加载时执行,所以我不确定如何在注入JavaScript时执行它 下面是show.js.erb,其中部分被调用: $("body").append( "<%=j render :partial => 'contents', :locals => {:folder =

我有两个部分,一个叫做_contents.html.erb,它加载D3.js的一些标记,另一个叫做_show.js.erb,它加载JavaScript与_contents中的标记交互。但是,JavaScript只在页面加载时执行,所以我不确定如何在注入JavaScript时执行它

下面是show.js.erb,其中部分被调用:

$("body").append( "<%=j render :partial => 'contents', :locals => {:folder => @folder } %>" );
$("#jscripts").append("<%=j render :partial => 'show', formats: :js, :locals => {:folder => @folder} %>");
$(“body”).append(“'contents',:locals=>{:folder=>@folder}%>”;
$(“#jscript”).append(“'show',formats::js,:locals=>{:folder=>@folder}%>”;
以下是_show.js.erb:

var data;
d3.json("/folders/<%= @folder.id %>.json"), function(error, json) {

if (error) return console.warn(error);

data = json;

var svg = d3.select("svg"),
folderChildren = [],
circle;

var submissions = data.submissions;


for(submission in submissions) {
    var submissionWords = submission.content.split(' ').join('');
    var size = submissionWords.length;
    folderChildren.push(size);
};

circle = svg.selectAll("circle")
 .data(folderChildren)
 .enter().append("circle")
     .attr("cy", 90)
     .attr("cx", String)
     .attr("r", Math.sqrt);

circle.exit().remove(); 
var数据;
d3.json(“/folders/.json”),函数(错误,json){
如果(错误)返回控制台。警告(错误);
data=json;
var svg=d3。选择(“svg”),
folderChildren=[],
圆圈
var提交=数据提交;
(以书面形式提交){
var submissionWords=submission.content.split(“”).join(“”);
变量大小=submissionWords.length;
folderChildren.推送(大小);
};
圆圈=svg。选择全部(“圆圈”)
.数据(folderChildren)
.enter().append(“圆”)
.attr(“cy”,90)
.attr(“cx”,字符串)
.attr(“r”,数学sqrt);
circle.exit().remove();
})


第二行注入了JS部分,当我在Chrome开发者控制台中检查时,它确实成功地将它与我的其余JavaScript一起注入。现在,如何执行它?

show.js
中,您可以删除secound行,并用render命令替换它,如下所示:

<%=j render :partial => 'show', formats: :js, :locals => {:folder => @folder} %>
'show',forms::js,:locals=>{:folder=>@folder}%>

append方法将html追加到页面,但当您追加js时,它不会执行,因为加载页面时js只被解析一次,因此append方法不是解决您问题的合适方法。

我发布的解决方案有什么问题?它不能满足您的需要吗?它不能回答OP发布的问题,他需要在用rails_ujs呈现后执行一段js。您必须将js文件中的函数(包含在#jscript块中的函数)公开到全局名称空间,然后在show.js.erb中调用它。暴露于全局名称空间并不理想,但在处理我自己的项目时,我想不出另一种方法。所以,非常感谢!