2010-03-17 16 views
9

Zastanawiam się, jaka jest najlepsza praktyka przekazywania zmiennych do funkcji JavaScript w widoku szyn. Teraz robię coś takiego:Przekazywanie zmiennych ruby ​​do funkcji javascript w widoku szyn

<% content_for :javascript do %> 
    <script type="text/javascript"> 
    Event.observe(window, 'load', function(){   
     js_function(<%= @ruby_array.to_json %>, <%= @ruby_var %>);)} 
    </script> 
<% end %> 

Czy to jest właściwa droga do tego?

Odpowiedz

19

Kilka opcji:

escape_javascript

Alias: j.

Działa tylko na ciągi.

Ucieka znaki, które mogą mieć specjalne znaczenie w ciągach JavaScript, , podobnie jak odwrotne ukośniki odwrotne, w formacie odpowiednim do umieszczenia w literałowych cytatach napisów JavaScript.

Utrzymuje html_safe status wejścia, więc potrzebuje html_safe inaczej znaki specjalne HTML jak < dostanie uciekł do &lt;.

<% a = "\\n<" %> 
<%= javascript_tag do %> 
    '<%= j(a)   %>' === '\\n&lt;' 
    '<%= j(a).html_safe %>' === '\\n<' 
<% end %> 

to_json + html_safe

Jak wspomniano przez Wiaczesława przejdź upvote go.

Działa, ponieważ JSON to almost a subset of Javascript object literal notation.

Działa nie tylko na obiektach haszujących, ale również na łańcuchach, tablicach i liczbach całkowitych, które są konwertowane na fragmenty JSON odpowiedniego typu danych.

<% data = { key1: 'val1', key2: 'val2' } %> 
<%= javascript_tag do %> 
    var data = <%= data.to_json.html_safe %> 
    data.key1 === 'val1' 
    data.key2 === 'val2' 
<% end %> 

teleinformatyczny atrybuty

Dodaj wartości atrybutów, pobierać je z operacji JavaScript DOM.

lepiej z content_tag pomocnika:

<%= content_tag 'div', '', id: 'data', data: {key1: 'val1', key2: 'val2'} %> 
<%= javascript_tag do %> 
    $('#data').data('key1') === 'val1' 
    $('#data').data('key2') === 'val2' 
<% end %> 

Czasami nazywany "dyskretny JavaScript".

gon

Biblioteka specjalizuje się w pracy: https://github.com/gazay/gon

Prawdopodobnie najbardziej niezawodne rozwiązanie.

Gemfile:

gem 'gon' 

Kontroler:

gon.key1 = 'val1' 
gon.key2 = 'val2' 

Układ app/views/layouts/application.html.erb:

<html> 
<head> 
    <meta charset="utf-8"/> 
    <%= include_gon %> 

Widok:

<%= javascript_tag do %> 
    gon.key1 === 'val1' 
    gon.key2 === 'val2' 
<% end %> 

Zobacz także

1

Istnieje technika o nazwie "dyskretny javascript". Oto Railscast na ten temat: link text. Działa zarówno z prototypem jQuery. Istnieją również wtyczki, które mogą uprościć niektóre zadania opisane w tym artykule.

6
- content_for :javascripts_vars do 
    = "var costs_data = #{@records[:cost_mode][:data].to_json}".html_safe 
    = "var graph_data = #{@records[:cost_mode][:graph].to_json}".html_safe 
0

Znalazłem ten klejnot client variable, pomaga to z łatwością.

+0

Proszę, spróbuj przeczytać ten http://stackoverflow.com/help/deleted -answers, aby lepiej zrozumieć, jak ** nie ** odpowiedzieć. Mianowicie: "Odpowiedzi, które zasadniczo nie odpowiadają na pytanie": ** niewiele więcej niż link do strony zewnętrznej ** –

+1

dzięki, zrobię więcej informacji w moich odpowiedziach – MQuy

0

W haml danych może są przedstawiane tak:

.position{data: {latitude: @claim.latitude.to_json, longitude: @claim.longitude.to_json}} 

:javascript 
    var latitude = $('.position').data('latitude'); 
    var longitude = $('.position').data('longitude'); 
Powiązane problemy