ruby-on-rails ajax pagination prototypejs

ruby on rails - will_paginate ajax con fade



ruby-on-rails pagination (4)

Esto es lo que hice usando jQuery y también funcioné bien :)

Pon tu llamada a will_paginate helper view en un div

#tickets_pagination = will_paginate @tickets

En application.js

$("#tickets_pagination .pagination a").live("click", function() { $.get("/users/?"+this.href.split("?")[1], null, null, "script"); return false });

El javascript anterior convertirá los enlaces de paginación en #tickets_pagination en enlaces ajax.

En tu controlador como de costumbre

def index @tickets = Ticket.all.paginate({:page => params[:page], :per_page => 10 }) respond_to do |format| format.js format.html end end

Ahora finalmente en index.js.erb

$("#tickets_list_table").fadeOut(''slow''); $("#tickets_list_table").html("<%= escape_javascript(render :partial =>''tickets/tickets_table'', :locals => {:tickets => @tickets}) %>"); $("#tickets_list_table").fadeIn(''slow'');

Aquí tickets/ticket_table tiene una tabla que enumera todos los boletos. El parcial se procesa en div #ticket_list_table

Espero que esto funcione para ti también.

Estoy tratando de ajaxificar mi paginación de will_pagniate en rieles. Quiero que la página anterior se desvanezca y la nueva desaparezca.

Aquí está la parte relevante de mi controlador:

respond_to do |format| format.html # new.html.erb format.js { render :update do |page| page.replace ''page'', :partial => ''cur_page'' end } format.xml { render :xml => @branch } end

El parcial mencionado anteriormente:

<div id="page"> <%= will_paginate %> <div id="posts"> <%= render @posts %> </div> <%= will_paginate %> </div>

Y la parte relevante de application.js:

document.observe("dom:loaded", function() { // the element in which we will observe all clicks and capture // ones originating from pagination links var container = $(document.body) if (container) { var img = new Image img.src = ''/images/spinner.gif'' function createSpinner() { return new Element(''img'', { src: img.src, ''class'': ''spinner'' }) } container.observe(''click'', function(e) { var el = e.element() if (el.match(''.pagination a'')) { el.up(''.pagination'').insert(createSpinner()) target = $(''posts'') new Effect.fade(target, { duration: 0.3, afterFinish: function() { new Ajax.Request(el.href, { method: ''get'', onSuccess: function(){ new Effect.Appear(target, {duration:0.3})} }) }}) e.stop() } }) } })

La secuencia de comandos parece ser asesinado en esta línea,

new Effect.fade(target, { duration: 0.3, afterFinish: function()

porque veo el inicio spinner.gif, luego no hay desvanecimiento y la página se actualiza normalmente. Tengo el ajax funcionando antes de intentar agregar Effect.Fade y Effect.Appear.

¿Es esta la manera correcta de hacerlo? ¿Debería poner los efectos en el controlador en su lugar?


No muy familiarizado con RoR, ¿genera su propio JS del lado del cliente que posiblemente puede estar luchando contra su código?

Si no, diría que el problema está en algún lugar de tu propio código del lado del cliente. Para las pruebas, deshágase del atributo HREF de la etiqueta ancla y coloque la URL como una cadena literal en la solicitud Ajax. Si no ocurre nada, hay un problema con la solicitud de Ajax. Si la página se carga como se esperaba, entonces el evento en el escenario original no se detiene por completo.

Además, limpie un poco su JS para asegurarse, puntos y comas de punto y coma donde sea necesario.


Traté de poner más trabajo en los ayudantes de Javascript:

respond_to do |format| format.html # new.html.erb format.js { render :update do |page| page.visual_effect :fade, ''posts'', :afterFinsh => "function(){" + page.replace ''page'', :partial => ''cur_page'' + page.visual_effect(:appear, ''branches'') + "}" end } format.xml { render :xml => @branch } end

Luego eliminó esta parte del javascript:

new Effect.fade(target, { duration: 0.3, afterFinish: function()

Obtengo el efecto que quiero, pero todo fuera de orden. La solicitud se completa y el html es reemplazado, luego el div desaparece y luego vuelve a aparecer.


Parece que mezclas las cosas un poco. O bien escribe $(''posts'').fade new Effect.fade(''posts'') o new Effect.fade(''posts'') .

En segundo lugar, no puedo encontrar la opción afterFinish en la documentación .

Entonces, sugeriría algo en las siguientes líneas:

container.observe(''click'', function(e) { var el = e.element() if (el.match(''.pagination a'')) { el.up(''.pagination'').insert(createSpinner()) target = $(''posts'') new Effect.fade(''posts'', { duration: 0.3}); setTimeout("new Ajax.Request(el.href, { method: ''get'', onSuccess: function(){ new Effect.Appear(''posts'', {duration:0.3}) } })", 1000); e.stop(); } })

Espero que esto ayude.