【问题标题】:How do I generate dynamic items dynamically?如何动态生成动态项目?
【发布时间】:2009-07-05 04:05:02
【问题描述】:

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

我看不到动态生成这种性质的动态项目的方法(此外,可能创建一个部分来呈现非对象)。

【问题讨论】:

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


    【解决方案1】:

    您查看jQuery 了吗?它是一个流行的 JavaScript 库。它可以轻松完成您所描述的操作。我已经使用了多年,它从未让我失望。

    This page of the documentation 显示append() 方法。你可以做类似...

    $("span").appendTo("#foo");
    

    $("span") 部分查找 DOM 的一个(或多个)元素,然后 appendTo("#foo") 部分将其附加到 DOM 的另一个元素。

    您还可以附加 HTML 的任意 sn-ps。如果需要,可以通过 AJAX 请求检索这样的 sn-p。 jQuery 具有非常简单可靠的 AJAX 支持。

    使用 jQuery,基本概念是将 JavaScript 方法绑定到单独的 .js 文件中的 DOM 元素,而不是使用 HTML 的“on_this”或“on_that”属性。所以如果你在这种情况下使用 jQuery,你就不会想到通过模板生成 JS 代码。 add()remove() 函数将在您的 .js 文件中准备就绪,您可以根据需要将它们绑定和取消绑定到 DOM 元素。例如,当您将li 添加到列表中时,您将解除add() 函数与li 的绑定并将remove() 函数绑定到它。

    【讨论】:

      【解决方案2】:

      您可能正在寻找一些 javascript 模板解决方案。看看这个链接...

      http://www.hokstad.com/mini-reviews-of-19-ruby-template-engines.html

      希望这能回答你的问题。

      【讨论】:

        【解决方案3】:

        警告:hacky 解决方案。

        我有一个选择列表,我需要从中动态添加和删除元素。两者都是 AJAX 调用。

        控制器方法呈现一个包含 Javascript 的部分,以从选择列表中添加和/或删除项目。部分,它是一个普通的旧 erb 文件,与任何其他部分一样,插入适当的 DOM 标识符(从列表中对象的对象 ID 生成)。

        我查看了一些 Javascript 模板解决方案,但没有一个足够灵活。最后自己生成Javascript更容易。

        【讨论】:

        • 是的,这就是我目前正在做的事情。它似乎工作正常,我只是希望我能找到一种方法将它从部分恢复。在控制器中使用辅助方法的正确语法对我来说并不直观(如果可能的话)。谢谢。
        【解决方案4】:

        这很容易。有很多事情可以为你做这件事(查看 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%>
        

        这对我有用,因为我可以使用会话变量。不过要小心!在某些情况下,用户将拥有具有相同表单的多个窗口,这肯定会中断,因为会话变量会有并发访问。

        由于我也在对此进行一些自动完成,所以缺少一些部分,但我希望这会帮助您获得大创意。

        【讨论】:

        • 感谢您所做的一切,但我只是为此尝试使用 Rails 和 Rails Helpers。如果没有办法做到这一点,那么我会走 JS 路线。目前我只是使用部分来处理所有事情,但我希望能够从“render :update”部分完成。再次感谢。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多