0

こんばんは

JS パーシャルをレンダリングするときに、マニフェスト ファイル内の JavaScript 関数にアクセスできないという問題があります。以下は、現在の article#index ページを機能させるファイルです。

マニフェスト ファイル:

assets/javascripts/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 でアクセスしたい関数です

assets/javascript/articles.js.coffee

//= require option_set_interface

article_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

ビューとパーシャル:ビュー/記事/

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 にアクセスできます。しかし、私のカスタム関数を受け入れないようです。ヘルプやアドバイス、特に Rail の ajax でレンダリングされた JS をデバッグする方法に関するヒントをいただければ幸いです。現在、load_article_click_handlers にアクセスしようとすると、スクリプトがまったく実行されません。

私が試したこと:

create.js.erb で javascript_inlude_tag 'option_set_interface' を使用して、'//= require option_set_interface' を application.js に追加します。

編集

1 つの修正が見つかりましたが、問題は解消されませんでした。

4

1 に答える 1

0

解決しました。

私は間違った道を進んでいました。問題は、coffeescript の匿名関数ラッパーにありました。この機能は、「グローバル名前空間の汚染」を回避するために構築されました。これはまさに私がインクルード ファイルでやりたかったことでした。

解決策は追加することです

window.load_article_click_handlers = load_article_click_handlers

load_article_click_handlers の定義の後。

これが他の誰かに役立つことを願っています。

于 2013-08-11T18:13:59.877 に答える