ajax - 在 Laravel 4 中等待 Controller 时显示进度

标签 ajax laravel progress

我有一个表单,想通过 ajax-post 发送到我的 Controller 。同时,HTML 正在等待记录的生成和保存,我想显示进度(现在只是数字)。我实在不明白为什么下面的代码不更新<div id="progress">Session::get('progress') .

Controller :

public function postGenerate() {
    // getting values from form (like $record_num)
    Session::flash('progress', 0);
    $i = 1;
    for ($i; $i < $record_num; $i++) {
        $record = new Record();
        // adding attributes...
        $record->save;
        Session::flash('progress', $i);
    }
    $response = Response::make();
    $response->header('Content-Type', 'application/json');
    return $response;
}

Javascript:

@section('scripts')
<script type="text/javascript">
    $(document).ready(function() {
        $('#form-overview').on('submit', function() {
            setInterval(function(){
                $('#progress').html( "{{ Session::get('progress') }}" );
            }, 1000);
            $.post(
                $(this).prop('action'),
                {"_token": $(this).find('input[name=_token]').val()},
                function() {
                    window.location.href = 'success';
                },
                'json'
            );
            return false;
        });
    });
</script>   
@stop

HTML:

@section('content')
    {{ Form::open(array('url' => 'code/generate', 'class' => 'form-inline', 'role' => 'form', 'id' => 'form-overview' )) }}
    <!-- different inputs ... -->
        {{ Form::submit('Codes generieren', array('class' => 'btn btn-lg btn-success')) }}
    {{ Form::close() }}

    <div id="progress">-1</div>
@stop

最佳答案

这是因为 {{ Session::get('progess') }} 仅在页面首次呈现时评估一次。完成您想要的操作的唯一方法是实际向报告进度的不同 URL 发出额外的 AJAX 请求。像这样的事情:

Controller

// Mapped to yoursite.com/progress
public function getProgess() {
    return Response::json(array(Session::get('progress')));
}

public function postGenerate() {
    // getting values from form (like $record_num)
    Session::put('progress', 0);
    Session::save(); // Remember to call save()

    for ($i = 1; $i < $record_num; $i++) {
        $record = new Record();

        // adding attributes...

        $record->save();
        Session::put('progress', $i);
        Session::save(); // Remember to call save()
    }

    $response = Response::make();
    $response->header('Content-Type', 'application/json');
    return $response;
}

JavaScript

@section('scripts')
<script type="text/javascript">
    $(document).ready(function() {
        $('#form-overview').on('submit', function() {
            setInterval(function(){
                $.getJSON('/progress', function(data) {
                    $('#progress').html(data[0]);
                });
            }, 1000);

            $.post(
                $(this).prop('action'),
                {"_token": $(this).find('input[name=_token]').val()},
                function() {
                    window.location.href = 'success';
                },
                'json'
            );

            return false;
        });
    });
</script>   
@stop

关于ajax - 在 Laravel 4 中等待 Controller 时显示进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21530743/

相关文章:

在我刷新页面之前 CSS 不适用?

javascript - Laravel 表单与 jquery 仅显示纯文本

c# - 使用 IProgress<T> 从后台线程报告

javascript - 使用百分比值更新进度条?

javascript - Google Storage API - 可恢复上传、AJAX、CORS 错误

javascript - 如何保持从服务器获取响应? (PHP、JS、HTML)

javascript - jQuery ajax (json) 调用的内存泄漏

php - 在laravel中获取没有扩展名的文件名?

php - 带有条件消息的 Laravel 自定义表单验证

java - 如何在 Android ProgressDialog 中显示 SecondaryProgress?