2013-02-23 35 views
5

PJAX stwierdza, że ​​Github używa $.pjax.submit() w submitting a Gist form. Pożądaną cechą przesłania formularza ajaxowego, który Github ładnie implementuje, jest przekierowanie adresu URL z formularza action do nowo utworzonego adresu URL (w tym przypadku zawierającego nowo utworzony identyfikator mista utworzonego po stronie serwera).Przesyłanie adresu URL pliku pjax w formacie

Na przykład, z tego:

https://gist.github.com/gists // form action 

do tego:

https://gist.github.com/tim-peterson/5019589 //assume this ID is generated server side 

stałam to działało podobnie na mojej stronie (czyli sama strona przekierowuje do równowartości https://gist.github.com/tim-peterson/5019589), ale nie mogę przekierować adresu URL (pozostaje taki jak https://gist.github.com/gists).

Czy to jest całkowicie problem z serwerem (ustawianie nagłówków?) Lub czy jest coś w pjax, którego mi brakuje? Używam wersji pjaxa, którą dziś ściągnąłem, więc nie może być tak, że używam buggierowej wersji pjax.

Odpowiedz

1

Może być bardziej elegancki/właściwy sposób zrobienia tego za pomocą $ .pjax.submit(), ale jest to rozwiązanie, z którego korzystałem bez żadnych problemów. Serializuję formularze wejściowe przed przesłaniem, a następnie POST je do mojego serwera. Następnie sprawdź odpowiedź z serwera, aby się upewnić, że nie będę musiał przeszkadzać użytkownikowi w przejściu dalej, zanim zadzwonię do PJAX, aby kontynuować.

$("#save").click(function(e) { 

    e.preventDefault(); 
    dataString = $("#form").serialize(); 

    $.ajax({ 
    type: "POST", 
    url: $("#form").attr("action"), 
    data: dataString, 
    dataType: "json", 
    success: function(data) 
    { 
     // Handle the server response (display errors if necessary) 

     $.pjax({ 
     timeout: 2000, 
     url: data.url, 
     container: '#main-content' 
     }); 

    } 
    }); 
}); 
+0

dzięki tak właśnie to robię też jako hack rozwiązanie. Pytanie brzmi, czy można to osiągnąć za pomocą 2 żądań AJAX, czy po prostu 1. Oczywiście lepiej byłoby mieć tylko jedno żądanie, w którym 'data.url' został przesunięty na pasek przeglądarki, tak jak treść została przesunięta na'. # główna treść ". Teraz, gdy na to patrzę, Github Gist wydaje się robić to samo, co my, robiąc 2 żądania, mimo że robią PJAX (POST) -> PJAX (GET) i robimy AJAX (POST) -> PJAX (OTRZYMAĆ). Najważniejsze jest to, że bardziej wydajne byłoby wykonanie tylko jednego wniosku (kontynuacja w następnym komentarzu ...). –

+0

Po prostu nie jestem pewien, czy wykonanie tego na 1 żądanie jest możliwe z PJAX lub czy wymaga on hack po stronie serwera, którego nie jestem świadomy (używam PHP/Codeigniter i robię przekierowanie 301/302 z AJAX żądania nie zmieniają adresu URL, być może nie jest to możliwe w żadnym języku/strukturze?). –

5

Czy znalazłeś jakieś rozwiązanie tego? Miałem podobny problem.

Zasadniczo należy ustawić właściwość X-PJAX-URL w nagłówku odpowiedzi. Jego wartość powinna być taka sama jak URL żądania.

W laravel, zrobiłem to w ten sposób ...

App::after(function($request, $response) 
{ 
    $response->headers->set('X-PJAX-URL', $request->getRequestUri()); 
}); 
0

Zdarza się, jeśli odpowiedź HTML nie zawiera pierwotnego pojemnika PJAX