将 JavaScript 数组从视图传递到 Laravel 控制器

Posted

技术标签:

【中文标题】将 JavaScript 数组从视图传递到 Laravel 控制器【英文标题】:Passing JavaScript array from view to Laravel controller 【发布时间】:2016-01-21 11:08:12 【问题描述】:

我正在尝试使用 ajax 将 objs 数组传递给 Laravel 控制器中的函数。发布后我没有收到任何数据。

<script>

        var itemCount = 0;
        var objs=[];
        $(document).ready(function()


            var temp_objs=[];

            $( "#add_button" ).click(function() 

                var html = "";

                var obj = 
                    "ROW_ID": itemCount,
                    "STREET_ADDRESS": $("#street_address").val(),
                    "CITY": $("#city").val(),
                    "ZIP": $("#zip").val()
                

                // add object
                objs.push(JSON.stringify(obj));

                itemCount++;
                // dynamically create rows in the table
                html = "<tr id='tr" + itemCount + "'><td>" + obj['STREET_ADDRESS'] + "</td> <td>" + obj['CITY'] + " </td> <td>" + obj['ZIP'] + " </td><td><input type='button'  id='" + itemCount + "' value='remove'></td> </tr>";

                //add to the table
                $("#multiple_table").append(html)

                // The remove button click
                $("#" + itemCount).click(function () 
                    var buttonId = $(this).attr("id");
                    //write the logic for removing from the array
                    $("#tr" + buttonId).remove();
                );

            );

            $("#submit").click(function() 
                $.ajax(
                    url:'/app/Http/Controllers/Search/search_address',
                    type: 'POST',
                    dataType:'json',
                    contentType: 'application/json',

                    data: objs
                );

            );

        );



    </script>

在我的控制器功能是这样的

public function search_address()
    $data = json_decode($_POST['data'], true);
    print_r($data);

我想我在 ajax 中的 url 有问题,我不确定如何获取控制器的 url。

谢谢

【问题讨论】:

在开发者工具中检查网络标签.. 你的 ajax 加载了吗?你检查过你的浏览器控制台看是否有任何错误被抛出? 暂时忘掉 javascript/AJAX... 你能用 HTML/php/Laravel 构建一个表单来做你想做的事吗?我想确保你的控制器和路由首先工作。 嘿萨扬。这方面有什么进展吗? 【参考方案1】:

你应该console.log()你的javascript,在你的ajax帖子中放置以下内容:

error : function(e)
   console.log(e);

然后您可以在浏览器的开发人员工具面板中查看遇到的错误。

您还应该知道,Laravel 帖子需要 csrf token,除非您已明确关闭它们,这意味着您也需要将此令牌添加到您的帖子中。所以你应该最终得到:

$("#submit").on('click', function() 
    $.ajax(
        url:'/app/Http/Controllers/Search/search_address', // Is this what you meant, is this the route you set up?
        type: 'POST',
        data: 'data': objs, '_token' : '<?=csrf_token()?>',
        success : function(data)
          // Do what you want with your data on success
        ,
        error : function(e)
           console.log(e);
        
    );
);

请注意,我在 javascript 中嵌入了 php,这只是为了说明这一点。理想情况下,javascript 保存在它自己的文件中,因此您需要找到一种方法来传递此令牌。我个人使用knockoutjs 处理这类事情(AngularJS 也很流行),但您可以轻松地执行以下操作:

<input type="hidden" id="_token" value=" csrf_token() " />

在您的 HTML 中,然后从您的 ajax 请求中提取此值:

data: 'data': objs, '_token' : $('#_token').val()

编辑

我刚刚注意到您的网址,看起来您正在尝试直接访问控制器。你需要在你的routes.php文件中设置路由,比如:

Route::post('/searchAddress', 'YourController@search_address');

然后使用:

url: /searchAddress

在您的 ajax 请求中。

【讨论】:

我试过你的建议,还是不行。还有什么我需要注意的吗? 您在浏览器的 javascript 控制台中得到了什么结果?另外,您是否检查过您的日志以查看是否抛出了任何错误?【参考方案2】:

你能改变吗:

$data = json_decode($_POST['data'], true);

到:

$data = json_decode(Input::get('data'));

并确保您有:use Input; 在您的 class extends Controller 上方

看看这是否有效。

编辑:还要确保您的路线(在 Controllers 文件夹中)是正确的。

【讨论】:

不,Input::get,我目前正在与 Laravel 合作一个项目,我们就是这样做的。 我不知道为什么或是否 $_POST 不起作用,因为我从未在 Laravel 项目中使用过它,我只是举例说明了我如何从 ajax 调用中获取数据。

以上是关于将 JavaScript 数组从视图传递到 Laravel 控制器的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.2 - 如何将变量(数组和整数)从视图传递到控制器?

Rails - 将信息从视图传递到 Javascript

将 C# 模型从视图传递到 Javascript

将事件和模型属性从视图传递到 javascript 函数

将数组从视图控制器传递到视图控制器返回空数组

将数组从 AuthController 传递到 Laravel 5 中的登录视图