2

在 Ruby on Rails 项目中,我需要在 Ajax 调用结束时执行一个 JavaScript 函数。我的问题是传递给使用 page.call 调用的 JavaScript 函数的值被用引号括起来。如果您传入字符串,但其中一个值是 JavaScript 数组的字符串表示形式,即 [0,1,2,3],则问题不大。

以下是我认为重要的代码片段。

我有一个观察选择下拉列表的observe_field。

<%= observe_field("project_select_list",
    :loading => "Element.show('tree_indicator')",
    :complete => "Element.hide('tree_indicator')",
    :url => {:controller => "projects", :action => "change_project"},
    :with => "id")
%>

在 project_controller

def change_project()
    @current_project = Project.find(params[:id])
end

在 change_project.rjs

page.replace_html("project_name", @current_project.name)
page.visual_effect(:highlight, "project_name")
page.call("buildYUITreeView", "project_tree", @current_project.get_directory_contents(@current_project.local_path, 0))

最后一个值:

@current_project.get_directory_contents(@current_project.local_path, 0))

是什么导致我的问题。我只希望它发送值,例如 [0,1,2,3],但它发送“[0,1,2,3]”导致 JS 爆炸。

这个部分完成了它应该做的事情,它将数据而不是字符串发送到放置在页面上的 JavaScript 代码。

<% javascript_tag do -%>
    YAHOO.util.Event.addListener("dom:loaded", "load", buildYUITreeView("<%= tree_id %>", <%= project.get_directory_contents(project.local_path, 0) %>));
<% end -%>

考虑到这一点,我正在尝试使用部分,并在需要时将其渲染以调用 JS 函数,但这似乎是一个 hack。

如何使 page.call 不将作为参数发送的数据包装在引号中,或者我应该如何在 Ajax 调用完成后将此数据传递给 JS 函数以执行?

4

2 回答 2

4

汤姆走在了正确的轨道上,该<<方法是要走的路,因为它会直接插入任何javascript。您将要使用它而不是call.

page << "buildUYITreeView('project_tree', #{@current_project.get_directory_contents(@current_project.local_path, 0))})"

您可以对 tom 显示的行执行相同的操作,YAHOO这应该比使用带有 javascript 标记的部分更有效。

于 2009-08-03T15:56:10.013 回答
1

您可以改用 << 方法来发出原始 javascript:

page << 'YAHOO.util.Event.addListener("dom:loaded", "load", buildYUITreeView("project_tree", '+@current_project.get_directory_contents(@current_project.local_path, 0)+'))'
于 2009-08-02T03:47:54.783 回答