Rails 4 - 清单JS在AJAXed-in JS渲染中不可用

时间:2013-08-11 05:11:36

标签: javascript ruby-on-rails ajax asset-pipeline render

晚上好,

在呈现JS部分时,我遇到了在清单文件中访问javascript函数的问题。以下是使当前文章#index page工作的文件:

已显示的文件:

资产/ Javascript角/ option_set_interface.js.coffee.erb

on_load = ->
  load_article_click_handlers $('ul.index li.article')

$(document).ready on_load                        //standard DOM refresh
document.addEventListener 'page:change', on_load //turbolinks

load_article_click_handlers = (jQuery_object) ->
  .. Do some stuff...

load_article_click_handlers 是我想在create.js.erb中获取权限的函数

资产/ JavaScript的/ articles.js.coffee

//= require option_set_interface

articles_controller.rb:

class ArticlesController < ApplicationController

  def create
    @article = Article.new(article_params)
    @article.save

    respond_to do |format|
      format.html { redirect_to articles_path }
      format.js   { render 'create' }
    end
  end

  def index
    @articles = Article.all
  end

  protected
    def article_params
      params.require(:article).permit(:title)
    end
end

观看次数和部分内容: views / articles /

index.html.haml

- provide(:title, 'Article list')

%h1 Article list

.row
  .aside.span3
    .row
      %ul.index
        - @articles.each do |article|
          = render article
      = render 'new'

_article.html.haml

%li.article
  %input{ type: 'hidden', value: article.id, name: 'article_id' }
  = article.id
  = article.title

_new.html.haml

= form_for Article.new, remote: true, html: { id: 'new_article_form' } do |f|
  = f.label :title
  = f.text_field :title
  = f.submit 'Create', class: 'btn btn-large btn-primary'

create.js.erb(问题出在哪里)

new_list_item = $('<%= escape_javascript( render @article ) %>')
new_list_item.prependTo('ul.index').slideDown()
load_article_click_handlers(new_list_item) //this is the line that breaks the code

代码运行良好,直到我尝试在create.js.erb中调用load_article_click_handlers。我不知道如何获取它的调试信息,因为它使用rails的魔法ajax。我不太清楚如何捕捉回应。

create.js可以清楚地访问jquery。但它似乎不接受我的自定义功能。任何帮助或建议表示赞赏,特别是有关如何调试rails的ajax渲染JS的技巧。目前正在访问load_article_click_handlers,导致脚本根本无法运行。

我尝试过的事情:

将“// = require option_set_interface”添加到application.js 在create.js.erb中使用javascript_inlude_tag'option_set_interface'

修改

发现1次更正,没有消除问题。

1 个答案:

答案 0 :(得分:0)

解决。

我走错了路。问题出在coffeescript的匿名函数包装器上。该功能的构建是为了避免“污染全局命名空间”,这正是我想要用包含文件做的事情。

解决方案是添加

window.load_article_click_handlers = load_article_click_handlers
在定义load_article_click_handlers之后

希望这有助于其他人。