2013-06-30 10 views
9

Pracuję nad aplikacją w Rails 4.0 i mam problem z turbolinkami, które nie grają ładnie z jakimś kodem jQuery, który mam. Mam model wyceny, który ma powiązany model QuoteItems. Używam accepts_nested_attributes_for i jQuery do wypełnienia formularza elementów zamówienia.Railsy 4 TurboLinks i jQuery Dynamiczne połączenia nie grają Nicei

Po kliknięciu linku prowadzącego do ścieżki new_quote_path dynamiczne łącze nie uruchamia kodu javascript. Po odświeżeniu strony formularz DZIAŁA WIELKIM. Lubię turbolinks, ponieważ jest super szybki, ale nie wiem, jak sprawić, by działało to w fazie rozwoju. Oto kod.

w quotes.js.coffee

jQuery -> 
    $('form').on 'click', '.remove_line_items', (event) -> 
    $(this).prev('input[type=hidden]').val('1') 
    $(this).closest('fieldset').hide() 
    event.preventDefault() 

$('form').on 'click', '.add_fields', (event) -> 
    time = new Date().getTime() 
    regexp = new RegExp($(this).data('id'), 'g') 
    $(this).before($(this).data('fields').replace(regexp, time)) 
    event.preventDefault() 

Cytaty zobaczyć new.html.erb

<%= form_for @quote, :class => "hello" do |f| %> 
    <fieldset> 
     <p> 
     <%= f.label :quote_date, "Date of Quote" %> <br/> 
     <%= f.text_field :quote_date %> 
     </p> 

     <p> 
     <%= f.label :good_through %> <br/> 
     <%= f.text_field :good_through %> 
     </p> 

     <p> 
     <%= f.label :quote_number %><br/> 
     <%= f.text_field :quote_number %> 
     </p> 
     <p> 
     <%= f.label :customer_id, "Customer" %><br/> 
     <%= select(:quote, :customer_id, Customer.all.collect {|c| [ c.fname, c.id ] }, :prompt => "Select Customer") %> 
     </p> 

     <%= f.fields_for :quote_items do |builder| %> 
      <%= render 'quote_item_fields', :f => builder %> 
     <% end %> 

     <%= link_to_add_fields "Add Line Item", f, :quote_items %> 

     <p> 
     <%= f.submit %> 
     </p> 
    </fieldset> 
<% end %> 

Odpowiedz

16

miałem ten sam problem, jeśli chcesz zachować turbolinks pracę i dynamicznym jQuery, spróbuj ten klejnot: jquery-turbolinks

Nadzieja pomaga

+2

Działa to świetnie. dzięki, thomasstephn !! – asprotte

+0

Cieszę się, że mogę pomóc – thomasstephn

+0

To działa. Czy możesz mi wytłumaczyć dlaczego? –

2

linki Turbo wykorzystuje AJAX co oznacza wszelkie dynamicznie generowane elementy nigdy nie dostać ich gotowe zdarzenia przypisane (bo strona nie ładuje się technicznie po pierwszym załadowaniu). Zamiast tego trzeba posłuchać górnego elementu DOM body lub document a następnie określić selektor dla elementu dynamicznego słuchać:

$('body').on('click', '.remove_line_items', function(e) { ... });

(MoreDetails)

9

Niektóre opcje:

1) wyłączyć turbolinks - patrz http://blog.steveklabnik.com/posts/2013-06-25-removing-turbolinks-from-rails-4

2) użyć nowego zdarzenia page:load, że turbolinks pożary - $(document).on('page:load', your_start_function); patrz Rails Jquery doesn't work on other pages - zgadywania w przypadku byłoby to coś jak

$(document).on 'page:load' -> 
    $('form').on 'click', '.remove_line_items', (event) -> 
    $(this).prev('input[type=hidden]').val('1') 
    $(this).closest('fieldset').hide() 
    event.preventDefault() 
+3

Powinieneś raczej użyć '$ (document) .Na„rea dy page: load ', -> ', aby upewnić się, że funkcja ready jest wywoływana zarówno na twardych odświeżeniach, jak i stronach z turbolinkami. –

4

Może to pomoże:

$(document).on "turbolinks:load", -> 
    $('#some_element_id').click -> 
    alert "Clicked!" 
+0

Wypróbowałem wiele rzeczy (wszystko powyżej) i to w końcu zadziałało. Wielkie dzięki. – crisscross