在 Laravel 5.1 和 Vue JS 中保存多个数据动态表单
Saving multiple data dynamic form in Laravel 5.1 and Vue JS
我要add/post数据表。但是表单可以随着用户 'click' 在按钮上动态增加。我已经浏览过它,我得到了一些答案,比如使用 $request->all() 从输入表单中获取所有数据。
然后我的问题是,我的应用程序使用 VueJS 作为前端。 VueJS 脚本是否有任何配置 post 来自该动态表单的所有数据??
我的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 控制器上,我有简单的逻辑来测试结果数据是如何传递的。
$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
数组也会发生变化。然后当按下提交时,您只需 post 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;
}
}
});
编辑:
在控制器中,您可以使用 $request->input('messages');
,这将是消息数组。您可以使用以下方式插入多个新的 Outbox
模型:
Outbox::insert($request->input('messages'));
或
foreach($request->input('messages') as $message){
Outbox::create($message);
}
我要add/post数据表。但是表单可以随着用户 'click' 在按钮上动态增加。我已经浏览过它,我得到了一些答案,比如使用 $request->all() 从输入表单中获取所有数据。
然后我的问题是,我的应用程序使用 VueJS 作为前端。 VueJS 脚本是否有任何配置 post 来自该动态表单的所有数据??
我的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 控制器上,我有简单的逻辑来测试结果数据是如何传递的。
$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
数组也会发生变化。然后当按下提交时,您只需 post 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;
}
}
});
编辑:
在控制器中,您可以使用 $request->input('messages');
,这将是消息数组。您可以使用以下方式插入多个新的 Outbox
模型:
Outbox::insert($request->input('messages'));
或
foreach($request->input('messages') as $message){
Outbox::create($message);
}