0

resourceそれに固有のJavaScriptといくつかのJavaScriptのビューがあります。だから、私はJavascriptを忠実にapp/assets/javascripts/resource.js.coffee.

問題は、アプリケーションの他のビューに移動すると、次のようなあらゆる種類の Javascript エラーが発生することです。

Type issue: 'null' is not an object...

page_url = page_image.getAttribute('src');

app は正常に動作しますが、これらのスクリプトは実際には、意図されていないビューで実行しようとするべきではありません。

明らかに私は何かが欠けています...まあ...明らかです!それは何ですか?

4

3 に答える 3

2

デフォルトでは、application.jsにすべてのスクリプトが含まれapp/assets/javascripts、デフォルトでは、レイアウトにこれらすべてのスクリプトが含まれます。これには、ブラウザがJavascriptファイルに対して1つのリクエストを行うだけで済み、キャッシュできるという利点がありますが、すべてのJavascriptがすべてのページで実行されるという欠点があります。

2つの基本的な解決策があります:

  1. 必要なときに実行するはずのことを実行し、そうでないときは何も実行しないJavascriptを記述します。
  2. すべてを含まないように変更application.jsし、必要なときに個々のJavascriptファイルconfig.assets.precompileを含め、すべての新しいトップレベルファイルを含めるように変更します。
于 2012-09-21T18:29:44.253 に答える
1

一部のページでJavaScriptを実行するだけで、レールに組み込まれるものはありません。私が取るアプローチはこの投稿に基づいています

私のページ固有のコーヒースクリプトファイルはそれぞれ次のようになります

window.App.controller_name = 
  init: ->
    #stuff that happens for all actions
  edit: ->
    #Stuff that happens only for the edit action

body要素は、data-controller属性とdata-action属性で装飾されています。次に、application.jsの一部のJavaScriptが適切なJavaScriptを実行します。

execute_hook = (controller, action='init') ->
  ns = window.App
  if controller?
    if ns[controller] && typeof(ns[controller][action]) == "function"
      ns[toplevel][controller][action]()

jQuery ->
  body = document.body
  controller = body.getAttribute("data-controller")
  action = body.getAttribute("data-action")
  execute_hook(controller)
  execute_hook(controller, action)
于 2012-09-21T19:16:26.350 に答える
0

2 つの提案があります。1 つ目はハッキーで、2 つ目はすばらしいものです。

1. マニフェスト + レイアウト

異なる JS の組み合わせを必要とするビュー用に新しい JS マニフェスト ファイルを作成し、新しいレイアウトからそのマニフェスト ファイルを呼び出し、それらのビューをレンダリングするコントローラー アクションから新しいレイアウトを呼び出します。

あなたの例では:

app/assets/javascripts/resource.js.coffee

// Requires
//= require_whatever_js_files_your_resource_page_needs_here

// Custom JS below
...

アプリ/ビュー/レイアウト/resource.html.erb

...
<%# Within your <head> tag %>
<%= javascript_include_tag "resource" %>
...

app/controllers/resources_controller.rb

class ResourceController < ApplicationController
# filters, default layout, other actions, etc.
...

# Your action that needs only the resource JS,
# and therefore the resource layout
def action_that_only_uses_resource_js
  @some_objects = SomeObjects.all
  render layout: 'resource' # <- This is the important part
end

明らかに、この方法は柔軟ではないため、特にうまくスケーリングしません。つまり、JS を好きなように組み合わせることができず、間違いなく必要になります。これにより、JS を次のように分割することができます...

2. RequireJs モジュール

この gemを使用してRequireJsを Rails に統合します。探しているモジュール性が得られ、競合が発生するのを防ぐことができます。RequireJs は、あなたが探しているものだと私が信じているAMD パターンを採用しています。

于 2012-09-22T03:30:43.753 に答える