Javascript Rails 4-在呈现部分内容后运行代码的事件
我有一个js.erb文件,它是通过控制器动作用ajax调用的。js.erb文件呈现一个部分。在分部中是基于模型生成的数据属性。我需要一种仅在呈现分部后运行代码的方法,因为代码正在使用数据属性中的信息 项目\u controller.rbJavascript Rails 4-在呈现部分内容后运行代码的事件,javascript,jquery,ruby-on-rails,ajax,partials,Javascript,Jquery,Ruby On Rails,Ajax,Partials,我有一个js.erb文件,它是通过控制器动作用ajax调用的。js.erb文件呈现一个部分。在分部中是基于模型生成的数据属性。我需要一种仅在呈现分部后运行代码的方法,因为代码正在使用数据属性中的信息 项目\u controller.rb def remove_tag @item = Item.find_by_id(params[:id]) //code to remove tag from item @item.save respond_to do |form
def remove_tag
@item = Item.find_by_id(params[:id])
//code to remove tag from item
@item.save
respond_to do |format|
format.js
@item.reload
end
end
$("#taglist").html('<%= escape_javascript(render partial: "items/tag_list", locals: {item: @item}) %>');
//the code below needs to be run after the above partial is rendered
$('#add-tag').rules("add", {
tagUniqueness: $('#taglist').data('tag-list').split(', ')
});
<div id="taglist" data-tag-list="<%= item.all_tags_list %>">
//more html
</div>
删除标签js.erb
def remove_tag
@item = Item.find_by_id(params[:id])
//code to remove tag from item
@item.save
respond_to do |format|
format.js
@item.reload
end
end
$("#taglist").html('<%= escape_javascript(render partial: "items/tag_list", locals: {item: @item}) %>');
//the code below needs to be run after the above partial is rendered
$('#add-tag').rules("add", {
tagUniqueness: $('#taglist').data('tag-list').split(', ')
});
<div id="taglist" data-tag-list="<%= item.all_tags_list %>">
//more html
</div>
$(“#标记列表”).html(“”);
//下面的代码需要在呈现上述部分后运行
$('#添加标记')。规则(“添加”{
标记唯一性:$('#标记列表')。数据('标记列表')。拆分(','))
});
\u tag\u list.html.erb
def remove_tag
@item = Item.find_by_id(params[:id])
//code to remove tag from item
@item.save
respond_to do |format|
format.js
@item.reload
end
end
$("#taglist").html('<%= escape_javascript(render partial: "items/tag_list", locals: {item: @item}) %>');
//the code below needs to be run after the above partial is rendered
$('#add-tag').rules("add", {
tagUniqueness: $('#taglist').data('tag-list').split(', ')
});
<div id="taglist" data-tag-list="<%= item.all_tags_list %>">
//more html
</div>
//更多html
按照现在的方式,.rules方法使用的是在部分更新之前存在的html数据。要将哈希或数组从Ruby转换为javascript,可以使用
。\u json
,因为json基本上是javascript的一个子集
$('#add-tag').rules("add", {
tagUniqueness: <%= js @badge.all_tags_list.to_json %>
});
$('#添加标记')。规则(“添加”{
标记唯一性:
});
要将哈希或数组从Ruby转换为javascript,您可以使用。\u json
,因为json基本上是javascript的一个子集
$('#add-tag').rules("add", {
tagUniqueness: <%= js @badge.all_tags_list.to_json %>
});
$('#添加标记')。规则(“添加”{
标记唯一性:
});
这种类型的功能适用于javascript/jquery中的
回调函数在当前效果100%完成后执行
我们使用回调在ajax加载后执行函数(必须保持异步)。如果你能让他们工作,他们是非常有效的
有一个:
$(“#标记列表”).html(“”).promise().done(函数(){
$('#添加标记')。规则(“添加”{
标记唯一性:
});
});
这种类型的功能适用于javascript/jquery中的
回调函数在当前效果100%完成后执行
我们使用回调在ajax加载后执行函数(必须保持异步)。如果你能让他们工作,他们是非常有效的
有一个:
$(“#标记列表”).html(“”).promise().done(函数(){
$('#添加标记')。规则(“添加”{
标记唯一性:
});
});
您的视图应该只显示模型。如果您的视图正在更改模型,那么您正在做一些非常错误的事情,因为它严重违反了MVC。我的视图没有更改模型,模型将通过删除标记操作进行更改。taguniversity:“
-这似乎是一个更直截了当的解决方案,因为您只需从rails而不是从DOM获得它。@max我正在尝试使用您的建议获得正确的输出。我需要在@item上使用的方法是.all\u tags\u list。(来自)我正在使用remove_tag.js.erb
文件中的console.log进行检查。我尝试了console.log(“”
,它返回tag1、tag2、tag3
。如何将其设置为字符串数组?我尝试追加.split(“,”),但它给了我[[[“tag1”、“tag2”、“tag3”]]
很抱歉,我看错了你的JS,以为你想要一个字符串。您可以使用.to_json
将Ruby数组转换为javascript(因为有效的json就是有效的javascript)。您的视图应该只显示模型。如果您的视图正在更改模型,那么您正在做一些非常错误的事情,因为它严重违反了MVC。我的视图没有更改模型,模型将通过删除标记操作进行更改。taguniversity:“
-这似乎是一个更直截了当的解决方案,因为您只需从rails而不是从DOM获得它。@max我正在尝试使用您的建议获得正确的输出。我需要在@item上使用的方法是.all\u tags\u list。(来自)我正在使用remove_tag.js.erb
文件中的console.log进行检查。我尝试了console.log(“”
,它返回tag1、tag2、tag3
。如何将其设置为字符串数组?我尝试追加.split(“,”),但它给了我[[[“tag1”、“tag2”、“tag3”]]
很抱歉,我看错了你的JS,以为你想要一个字符串。您可以使用.to_json
将Ruby数组转换为javascript(因为有效的json就是有效的javascript)。我使用的是raw
而不是js
。一个比另一个好吗?在这种情况下,它可能并没有真正的区别-我不认为你可以通过创建一个真正有创意的标记名来进行XSS攻击,因为编码为JSON会逃脱它raw
可能更快,因为它不使用gsub
或者除了将字符串标记为安全之外实际上对字符串做任何事情。我使用的是raw
而不是js
。一个比另一个好吗?在这种情况下,它可能并没有真正的区别-我不认为你可以通过创建一个真正有创意的标记名来进行XSS攻击,因为编码为JSON会逃脱它raw
可能更快,因为它不使用gsub
或者除了将字符串标记为安全之外,实际上对字符串做任何事情。