javascript - 在 Laravel 5.1 和 Vue JS 中保存多个数据动态表单

标签 javascript forms laravel-5.1 vue.js

我必须添加/发布数据表单。但是当用户“单击”按钮时,表单可以动态增加。我已经浏览过它,并且得到了一些答案,例如使用 $request->all() 从输入表单中获取所有数据。

然后我的问题是,我的应用程序使用 VueJS 作为前端。 VueJS 脚本上是否有一些配置来发布该动态表单中的所有数据?

动态增加的My Blade模板:

<div id="form-message">
{!! Form::text('rows[0][DestinationNumber]', null, [
    'id' => 'recipient',
    'class' => 'form-control',
    'v-model' => 'newMessage.DestinationNumber'
    ])
!!}
{!! Form::textarea('rows[0][TextDecoded]', null, [
    'rows' => '3',
    'id' => 'recipient',
    'class' => 'form-control',
    'v-model' => 'newMessage.TextDecoded'
    ]) 
!!}
</div>

这个零数字会增加取决于用户点击添加按钮的次数。 然后是我的 VueJS 脚本

var newSingleMessage = new Vue({
el: '#newsinglemsg',
data: {
    newMessage: {
        DestinationNumber: '',
        TextDecoded: ''
    },
},
methods: {
    onSubmitForm: function(e) {
        e.preventDefault();
        var message = this.newMessage;

        this.$http.post('api/outbox', message);
        message = { DestinationNumber: '', TextDecoded: '' };
        this.submitted = true;
    }
}

});

在 Laravel Controller 上,我有简单的逻辑来测试数据如何传递的结果。

$input = $request->all();
$output = dd($input);
return $output;

并且,我使用 2 个附加表单对其进行测试。因此,数据应该是 3 行。结果(从FireBug检查)是这样的

{"DestinationNumber":"1234567890","TextDecoded":"qwertyuio"}

数据只传了一个,然后类型是JSON。即使我使用 return $output->toArray(),类型仍然是 JSON。

哦,是的,再一次。我不知道如何使用 javascript 使零数动态增加。测试时,我只是手动添加表单。这是我添加点击功能的javascript

var i = 0,
clone = $('#form-message').clone(),
recipient = document.getElementById('recipient');
recipient.setAttribute('name', 'rows['+ i +'][DestinationNumber]');
clone.appendTo('.form-message:last');
i++;

对于第二行和下一行,名称属性未添加到输入元素上。 谢谢

最佳答案

你以一种非常令人困惑的方式混合了blade、jquery和vue。看看这个用 Vue 完成所有这些的 JS fiddle:

https://jsfiddle.net/cr8vfgrz/10/

您基本上拥有一组消息,这些消息会使用 v-for 自动映射到输入。当这些输入发生变化时,您的 messages 数组也会发生变化。然后,当按下提交时,您只需发布 this.messages 并将消息数组发送到服务器。然后您可以清除数组以重置表单。

模板代码:

<div id="form-message">
<button class="btn btn-default" @click="addNewMessage">New Message</button>
<template v-for="message in messages">
    <input type="text" v-model="message.DestinationNumber" class="form-control">
    <textarea rows="3" v-model="message.TextDecoded" class="form-control"></textarea>
</template>
<button class="btn btn-success" @click.prevent="submitForm">Submit</button>
</div>

Vue 代码:

var newSingleMessage = new Vue({
    el: '#form-message',
    data: {
        messages: [
            {
                DestinationNumber: '',
                TextDecoded: ''
            }
        ],
        submitted:false
    },
    methods: {
        addNewMessage: function(){
            this.messages.push({
                DestinationNumber: '',
                TextDecoded: ''
            });
        },
        submitForm: function(e) {
            console.log(this.messages);
            this.$http.post('api/outbox', {messages:this.messages})
            .then(function(response){
                //handle success
                console.log(response);
            }).error(function(response){
                //handle error
                console.log(response)
            });
            this.messages = [{ DestinationNumber: '', TextDecoded: '' }];
            this.submitted = true;
        }
    }
});

编辑:

在 Controller 中,您可以使用 $request->input('messages'); 这将是消息数组。您可以使用以下方法插入多个新的 Outbox 模型:

Outbox::insert($request->input('messages'));

foreach($request->input('messages') as $message){
    Outbox::create($message);
}

关于javascript - 在 Laravel 5.1 和 Vue JS 中保存多个数据动态表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34891882/

相关文章:

javascript - 在 x 轴上带有范围选择器的 d3 条形图(如 dygraphs)

javascript - Django、javascript 和复杂表单

php - 如何最好地使用 php 预填充单选按钮选择?

php - 对于包含每个用户必须填写的大量复选框的表单,我应该使用什么数据库结构?

php - 这应该是中间件吗?

laravel - 关于 Laravel 5.1 安全性

javascript - 使用 Handlebars 在网页上显示nodejs查询结果?

javascript - AngularJS 在指令模板中使用 Canvas

python - 将 Django 上下文处理器与表单一起使用

php - 是否建议在同一个请求类中编写插入/更新/删除授权代码?