2012-04-13 13 views
3

Auf der Show-Seite zeige ich eine Liste von Daten des Auftretens eines periodischen Ereignisses an, und berechnete Statistiken über alle Daten wie Max., Min. Und Durchschnittsintervall zwischen aufeinanderfolgenden Daten.Wie löst man Ereignisse nach Abschluss einer Best_in_place-Bearbeitung aus?

Ich benutze das Juwel "best_in_place", um eine direkte Bearbeitung der Daten zu ermöglichen. Jedes Mal, wenn ein Datum geändert wird, müssen die Statistiken jedoch vom Server berechnet und erneut gerendert werden.

Wie hook 'ich eine Callback-Funktion zum Abschluss der Best_in_place-Bearbeitung, so dass die Statistiken neu gerendert werden können?

Das ist mein Rails-Code in show.html.erb

<td id="event_date"> 
    <%= best_in_place @event, :occur_date %> 
</td> 

, die in html ist

<td id="event_date"> 
    <span class='best_in_place' id='best_in_place_event_132_occur_date' data-url='/events/132' data-object='event' data-attribute='occur_date' data-type='input'>2012-03-23</span> 
</td> 

ich folgende Kaffee Skriptcode versucht:

jQuery -> 
$("#best_in_place_event_*_occur_date").live 'ajax:complete', (evt, data, status, xhr) -> 
    alert "a date has changed" 

Diese doesn Es scheint zu funktionieren, passiert nichts, nachdem ich ein Datum bearbeitet habe (vorkommendes Datum).

Wer weiß, wie ich ein Ereignis nach einer erfolgreichen Best_in_place-Bearbeitung auslösen sollte?

+0

Sie sagen: "Statistiken berechnet werden muss und von dem Server-re gemacht." Diese Neuberechnung findet also im Modell statt und wird vom Controller in der Update-Aktion aufgerufen, oder? Ich versuche nur meine Fakten zu klären, bevor ich antworte. – IAmNaN

+0

Ja, die Statistikberechnung erfolgt im Modell, und die Statistiken (z. B. max, min, avg) werden nicht in ActiveRecord gespeichert. Nicht sicher ob ich es richtig mache, aber ich gehe nicht durch den Controller, ich habe die Ansicht die Modellmethode aufgerufen. Hier sind meine Codes. In 'views/events/show.html.erb' \t \t \t <% = render: partiell =>" events_stats ",: einheimische => {: event => @event}%> Und in' views/events/_event_stats .html.erb': <% stats = Ereignis.get_event_stats%> <% if stats%>kürzeste:<% = stats [: min]%> Tage längste:<% = stats [max]%> Tage Durchschnitt:<% = stats [: Durchschnitt]%> Tage <% end %> –

Antwort

2

Nun, es sieht so aus, als ob best_in_place das ajax: success-Ereignis in seiner loadSuccessCallback korrekt auslöst. Das heißt, Sie sollten Ihre eigenen Funktionen mit einigen jQuery an das geänderte Ereignis binden können.

$(".best_in_place").live 'change', (event) -> 
    alert "Hello, World!" 
+2

Das funktioniert super. Stellen Sie sicher, dass Sie jQuerys "live" -Methode durch die neuere "on" -Methode ersetzen. – Stone

+1

Rechts, @Stone. Karen benutzte "live" in ihrer Frage, sie zeigte kein Elternelement, das ich mit "on" benutzen konnte, und es ist auch eine alte Antwort. – IAmNaN

+0

Totally, wollte nur, dass es jemanden informieren, der jetzt auf die Antwort schaut. Danke für deine Antwort übrigens! – Stone

1

wie für Ihr Beispiel:

<td id="event_date"> 
    <%= best_in_place @event, :occur_date, :classes => 'bip_date' %> 
</td> 

$('.bip_date').bind("ajax:success", function(){ 
alert("a date has changed") 
}); 
// or: $('.event_data .best_in_place').bind(...)  

Und von den official readme:

Das 'Ajax: Erfolg' Ereignis auf Erfolg ausgelöst wird.

Verwenden binden:

$('.best_in_place').bind("ajax:success", function() 
{$(this).closest('tr').effect('highlight'); }); 

einen Rückruf zu binden, die zu einem bestimmten Bereich spezifisch ist, verwenden Sie die Option ‚Klassen‘ in der Hilfsmethode und dann zu dieser Klasse binden.

<%= best_in_place @user, :name, :classes => 'highlight_on_success' %> 
<%= best_in_place @user, :mail, :classes => 'bounce_on_success' %> 

$('.highlight_on_success').bind("ajax:success", function(){bip_date}); 
$('.bounce_on_success').bind("ajax:success", function(){$(this).closest('tr').effect('bounce'));}); 
Verwandte Themen