2015-05-04 16 views
5

Trong trình điều khiển im của tôi đang cố gắng chuyển hướng ngược lại với thông báo Flash trong laravel 5. Tất cả đều hoạt động tốt. Vấn đề là không có vấn đề làm thế nào tôi thiết lập nó lên tin nhắn flash luôn xuất hiện lại nếu tôi điều hướng đi và sau đó trở lại bằng cách sử dụng nút quay lại của trình duyệt '.Thông báo flash Laravel 5 nhấp nháy một lần nữa sau khi điều hướng và sử dụng nút quay lại

Vì vậy, tôi có danh sách người dùng có nút xóa bên cạnh mỗi người dùng. Khi tôi nhấp vào nút xóa nó gọi phương thức điều khiển của tôi để tiêu diệt. Tôi thực hiện một chút điều kiện trong đó mà chuyển hướng trở lại với một lỗi nếu tôi đang cố gắng để xóa một chủ sở hữu. Tôi đã thử các cách khác nhau sau đây để chuyển hướng trở lại nhưng với tất cả tôi gió lên với cùng một vấn đề mà thông báo cho thấy một lần nữa sau khi điều hướng đi và trở lại thông qua nút quay lại của trình duyệt '.

return Redirect::route('users')->with('error_message', 'Some error msg'); 
Session::flash('error_message', 'Some error msg'); 
return Redirect::to('users'); 

Theo quan điểm của tôi, tôi nhặt nó lên như thế này:

@if (Session::has('error_message')) 
    {{ Session::get('error_message') }} 
@endif 

Vì vậy mà làm việc tốt, tôi nhận được tin nhắn. Nhưng ngay sau đó, ví dụ tôi nhấp vào một người dùng trong danh sách người dùng của tôi để đi đến trang chi tiết và nhấn nút 'quay lại' của trình duyệt, thông báo sẽ nhấp nháy lần nữa. Tôi không hiểu tại sao nó cứ nhấp nháy dữ liệu đó, tôi đã ấn tượng rằng nó chỉ nhấp nháy một lần.

Thậm chí nếu tôi cố gắng xóa nó ngay sau khi hiển thị (như dưới đây), nó không quan trọng, nó sẽ luôn xuất hiện lại?

{!! Session::forget('error_message') !!} 

Trả lời

1

Nói chung, khi người dùng nhấp vào nút quay lại trong trình duyệt, trình duyệt sẽ cố gắng hiển thị nội dung của trang trước mà không tải lại. Vì vậy, nó có khả năng không Laravel nhấp nháy vào phiên một lần nữa, nhưng trình duyệt cố gắng để giúp bạn ra bằng cách đệm trang cho bạn.

+0

bạn có thể cung cấp bất kỳ tài liệu nào hỗ trợ điều này không? –

+0

Nhưng tại sao một thông báo flash xuất hiện liên tục như vậy. Và nhiều hơn nữa làm thế nào tôi có thể ngăn chặn nó làm như vậy? Tôi có nghĩa là nó là một điều rất phổ biến để gió trở lại trên một trang thông qua nút quay lại vì vậy tôi không thể tưởng tượng rằng không ai khác có vấn đề của tin nhắn Flash hiển thị một lần nữa. – Ahzrael

+0

[this] (http://blog.55minutes.com/2011/10/how-to-defeat-the-browser-back-button-cache/) là tìm kiếm nhanh mà tôi tìm thấy hỗ trợ ý tưởng này –

0

Vâng, có vẻ như đó thực sự là bộ nhớ cache của trình duyệt và sau khi thêm mã để dừng bộ nhớ cache thì không sao và thông báo biến mất. Nó vẫn còn là lạ với tôi rằng tôi đã phải thêm mã này vào bộ điều khiển để ngăn chặn nó từ bộ nhớ đệm:

header('Cache-Control: no-store, private, no-cache, must-revalidate'); header('Cache-Control: pre-check=0, post-check=0, max-age=0, max-stale = 0', false); 
header('Pragma: public'); 
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); 
header('Expires: 0', false); 
header('Last-Modified: '.gmdate('D, d M Y H:i:s') . ' GMT'); 
header ('Pragma: no-cache'); 

Hoặc này trong htaccess:

<IfModule mod_headers.c> 
    Header set Cache-Control "no-cache, no-store, must-revalidate" 
    Header set Pragma "no-cache" 
    Header set Expires 0 
</IfModule> 

Nhưng điều đó có vẻ hơi quá mức cần thiết với tôi ;)

1

Tôi vừa gặp vấn đề này và tôi nghĩ cách duy nhất để giải quyết vấn đề là AJAX tải các tin nhắn flash của bạn vào trang.

Tôi chưa thử nghiệm điều này nhưng tôi giả định rằng khi người dùng quay lại và yêu cầu AJAX kích hoạt các tin nhắn flash trước đó sẽ bị xóa.

1

Bạn có thể hiển thị tin nhắn flash bằng javascript và sử dụng SessionStorage để ngừng lặp lại tin nhắn. Bộ nhớ cache của trình duyệt không biết trình duyệt đã hiển thị thông báo hay chưa nhưng chúng tôi có thể sử dụng SessionStorage để kiểm tra trước khi hiển thị.

<div id="flash-container"></div> 
... 

var popupId = "{{ uniqid() }}"; 

if(sessionStorage) { 
    // prevent from showing if it exists in a storage (shown); 
    if(!sessionStorage.getItem('shown-' + popupId)) { 
     $('#flash-container').append("<div>{{ session('status') }}</div>"); 
    } 
    sessionStorage.setItem('shown-' + popupId, '1'); 
} 
+0

. mã này, xin vui lòng cho tôi biết nếu điều này hoạt động hay không? – msbomrel

+0

Vâng, tôi đã làm. Công trình tuyệt vời –

+0

Có, nó cũng hoạt động cho tôi, cảm ơn rất nhiều. – msbomrel

1

Đối với những bạn không quan tâm đến nút quay lại:

@if (Session::has('error_message')) 
{{ Session::get('error_message') }} 
{{ Session::forget('error_message') }} 
@endif 

và nếu điều đó không làm cho nó rõ ràng ra, hãy thử:

@if (Session::has('error_message')) 
{{ Session::get('error_message') }} 
{{ Session::forget('error_message') }} 
{{ Session::save() }} 
@endif 
0

Bước 1: tạo một middleware sử dụng sau lệnh:

php nghệ nhân làm: middleware PreventBackHistory

Bước 2:

thay thế nội dung của PreventBackHistory.php với nội dung sau:

namespace App \ Http \ Middleware;

sử dụng Đóng cửa;

lớp PreventBackHistory {/ ** * Xử lý yêu cầu đến. * * @param \ Illuminate \ Http \ Yêu cầu $ request * @param \ Closure $ next * @return mixed */chức năng xử lý công cộng ($ request, Closure $ next) {$ response = $ next ($ request); return $ response-> header ('Cache-Control', 'no-cache, không lưu trữ, max-age = 0, phải-revalidate') -> header ('Pragma', 'no-cache') -> header ('Hết hạn', 'Mặt trời, 02 tháng 1 năm 1990 00:00:00 GMT'); }}

bước 3: đăng ký middleware trong kernal.php

'preventBackHistory' => \ App \ Http \ Middleware \ PreventBackHistory :: lớp,

bước 4: Sử dụng middleware trong của bộ điều khiển của bạn construstor

chức năng công cộng __construct() {$ this-> middleware ('preventBackHistory'); $ this-> middleware ('auth'); }

Và tốt để đi :)

Các vấn đề liên quan