我正在寻找一种使用javascript追加javascript元素的方法。基本上我有两个项目列表。一个具有“ADD”按钮的项目列表(使用“link_to_remote”),另一个具有带有“REMOVE”按钮的项目列表(使用“link_to_remote”)。当我点击“添加”时,它会立即将项目放入另一个列表中。但是,我需要能够让新插入的项目执行“REMOVE”的反向操作。
我认为没有办法(除了可能创建一个部分呈现非对象)动态生成这种性质的动态项目。
答案 0 :(得分:1)
你签出了jQuery吗?它是一个流行的JavaScript库。它可以轻松完成您所描述的内容。我已经使用它多年了,它永远不会让我失望。
This page of the documentation显示append()
方法。你可以做像...这样的事情。
$("span").appendTo("#foo");
$("span")
部分正在查找DOM的一个元素(或元素),然后appendTo("#foo")
部分将其附加到DOM的另一个元素。
您还可以附加任意HTML代码段。如果需要,可以通过AJAX请求检索这样的片段。 jQuery具有非常简单可靠的AJAX支持。
使用jQuery,基本概念是将JavaScript方法绑定到单独的.js
文件中的DOM元素,而不是使用HTML“on_this
”或“on_that
”属性。因此,如果你在这种情况下使用jQuery,你就不会考虑通过模板生成JS代码。 add()
和remove()
函数将在您的.js
文件中准备就绪,您可以根据需要将它们绑定并取消绑定到DOM元素。例如,当您向列表中添加li
时,您将从add()
取消绑定li
函数并将remove()
函数绑定到该函数。
答案 1 :(得分:0)
你可能正在寻找一些javascript模板解决方案。检查此链接...
http://www.hokstad.com/mini-reviews-of-19-ruby-template-engines.html
希望这能回答你的问题。
答案 2 :(得分:0)
警告:hacky解决方案。
我有一个选择列表,我需要动态添加和删除元素。两者都是AJAX调用。
控制器方法呈现包含Javascript的部分,以添加和/或从选择列表中删除项目。 partial,与任何其他partial一样的普通旧erb文件,插入适当的DOM标识符(从列表中对象的对象ID生成)。
我查看了一些Javascript模板解决方案,但没有一个足够灵活。最后,我自己生成Javascript更容易。
答案 3 :(得分:0)
这可能相当容易。有很多事情为你做这件事(查看jquery)。
我刚才手写了一些东西(抱歉编写得不好的代码)。它添加和删除播放列表中的曲目
<强>控制器:强>
def add_track
unless session[:admin_playlist_tracks].include?(params[:recording_id])
session[:admin_playlist_tracks] << params[:recording_id]
end
render :partial => "all_tracks"
end
def remove_track
session[:admin_playlist_tracks].delete_if {|x| x.to_s == params[:recording_id].to_s }
render :partial => "all_tracks"
end
<强>容器强>
<div id="artist_recordings" class="autocomplete_search"></div>
添加内容:
<%= link_to_remote "Add",
:url => {:controller => :playlists, :action => :add_track, :recording_id => recording.id},
:update =>"all_tracks",
:complete => visual_effect(:highlight, 'all_tracks') %>
显示/删除内容:
<%session[:admin_playlist_tracks].each do |recording_id|%>
<div style="margin-bottom:4px;">
[<%=link_to_remote "Remove",
:url => {:controller => :playlists, :action => :remove_track, :recording_id => recording_id},
:update =>"all_tracks"%>]
<%recording = Recording.find_by_id(recording_id)%>
<%=recording.song.title%> <br />
by <%=recording.artist.full_name%> (<%=recording.release_year%>)
</div>
<%end%>
这对我有用,因为我可以使用会话变量。不过要小心!在某些情况下,用户将拥有具有相同表单的各种窗口,这肯定会破坏,因为会话变量将同时访问。
有些部分缺失,因为我也在做一些自动完成,但我希望这会帮助你获得好主意。