【问题标题】:Ajax redirection with message带有消息的 Ajax 重定向
【发布时间】:2019-12-21 05:24:33
【问题描述】:

我正在尝试在 Laravel 项目中实现 Ajax 调用。目前,我正在寻找一种在 Ajax 成功执行某些操作并重定向页面后显示成功/错误消息的方法。 在 Laravel 控制器中,通常我可以这样做:

if($patient->wasRecentlyCreated){
    return redirect('/patients')->with('success','New patient data saved');
} else {
    return redirect('/patients')->with('error','Patient already exist');
}

在刀片视图中,我在布局页面中添加了消息部分(这样消息将出现在重定向页面的顶部):

@if(count($errors)>0)
    @foreach ($errors->all() as $error)
        <div class="alert alert-danger">
            {{$error}}
        </div>
    @endforeach
@endif

@if(session('success'))
    <div class="alert alert-success">
        {{session('success')}}
    </div>
@endif
@if(session('error'))
    <div class="alert alert-danger">
        {{session('error')}}
    </div>
@endif

在 Ajax 调用的情况下,我能够从 Laravel 控制器传递重定向目标 URL,但我不知道如何将成功/错误消息传递给 Ajax。 下面是我为处理 Ajax 而制作的 Laravel 控制器示例:

if($settlement->wasRecentlyCreated){
    return url('/patients');
}

在 Ajax 部分,我可以使用 window.location 进行重定向:

$.ajax({
    url: "/createsettlement",
    type: 'post',
    data: {
        billing_id      : billing_id,
        prices          : prices,
        _token          : '{{csrf_token()}}'
    },
    success: function (data) {
        console.log(data);
        window.location = data;
    },

知道如何在 Ajax 进行页面重定向时传递成功/错误消息吗?

【问题讨论】:

    标签: ajax laravel


    【解决方案1】:

    redirect('/page')-&gt;with('name', $data) 方法将会话数据闪烁到当前呈现的视图。要创建持久会话数据,请在重定向之前使用session(['name'=&gt;$data])

    像这样在你的代码中实现它:

    if($patient->wasRecentlyCreated){
        session(['success'=>'New patient data saved']);
        return redirect('/patients');
    } else {
        session(['error'=>'Patient already exist']);
        return redirect('/patients');
    }
    

    现在,您不必担心在 JavaScript 重定向后会话数据是否可用。只需确保您检索重定向 url 指向的页面的会话数据。

    另外,如果您想模拟默认的 flash 行为,您可以像这样在刀片文件中检索会话数据后删除它们

    @if(count($errors)>0)
        @foreach ($errors->all() as $error)
            <div class="alert alert-danger">
                {{$error}}
            </div>
        @endforeach
    @endif
    
    @if(session('success'))
        <div class="alert alert-success">
            {{session('success')}}
        </div>
    @endif
    @if(session('error'))
        <div class="alert alert-danger">
            {{session('error')}}
        </div>
    @endif
    
    @php
        if(session('success'))
            session()->forget('success');
        if(session('error'))
            session()->forget('error');
    @endphp
    

    【讨论】:

    • 感谢赐教,flash session 数据正是我要找的。​​span>
    【解决方案2】:

    好的。您可以同时进行重定向和显示。

    但考虑到 ajax 是 JS,你可以设置重定向的超时时间,即

    
        $('#error-alert').text('The text you want to display').show();
        setTimeout(() => {
            window.location =  url;
        }, 3000); //this case waits 3 secs to redirect to the page you want
    

    希望对你有帮助

    【讨论】:

    • 感谢您的快速响应和好建议。我之前没有想到这种方法。通常使用 Laravel,页面重新加载后,错误/成功消息会出现在目标页面上。是否可以对 jQuery 做同样的事情(以保持与其余页面相同的行为)?
    • 您可以为所有视图添加相同的逻辑。请注意,我正在考虑您正在使用 ajax 发送数据。如果您使用的是普通请求,则可以使用部分闪烁。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 2019-12-14
    • 2013-04-04
    • 2019-05-05
    相关资源
    最近更新 更多