我必须添加/发布数据表单。但是当用户“单击”按钮时,表单可以动态增加。我已经浏览过它,并且得到了一些答案,例如使用 $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/