如何动态生成动态项?

时间:2009-07-05 04:05:03

标签: javascript ruby-on-rails dynamic rails-generate

我正在寻找一种使用javascript追加javascript元素的方法。基本上我有两个项目列表。一个具有“ADD”按钮的项目列表(使用“link_to_remote”),另一个具有带有“REMOVE”按钮的项目列表(使用“link_to_remote”)。当我点击“添加”时,它会立即将项目放入另一个列表中。但是,我需要能够让新插入的项目执行“REMOVE”的反向操作。

我认为没有办法(除了可能创建一个部分呈现非对象)动态生成这种性质的动态项目。

4 个答案:

答案 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%>

这对我有用,因为我可以使用会话变量。不过要小心!在某些情况下,用户将拥有具有相同表单的各种窗口,这肯定会破坏,因为会话变量将同时访问。

有些部分缺失,因为我也在做一些自动完成,但我希望这会帮助你获得好主意。