所以我有一个呈现表单的组件,它也用从ajax请求接收的数据预填充了字段。
我的问题是,我不仅希望能够编辑字段,而且还希望添加新字段以同时提交,因此,我试图将预先填充的数据和新数据初始化为与我的ajax请求一起提交的相同对象。在我目前的设置下,表单数据在呈现表单之前并不能始终如一地填写字段。
这是表单模板
<form @submit.prevent="editThisWorkflow" class="d-flex-column justify-content-center" >
<div>
<input type="text" v-model="workflowData.workflow">
</div>
<div >
<div v-for="object in workflowData.statuses" :key="object.id">
<input type="text" v-model="object.status">
</div>
<div v-for="(status, index) in workflowData.newStatuses" :key="index">
<input type="text" placeholder="Add Status" v-model="status.value">
<button type="button" @click="deleteField(index)">X</button>
</div>
<button type="button" @click="addField">
New Status Field
</button>
</div>
<div>
<div>
<button type="submit">Save</button>
<router-link :to="{ path: '/administrator/workflows'}" >Cancel</router-link>
</div>
</div>
</form>
这是脚本
data() {
return {
workflowData: {
id: this.$store.state.workflow.id,
workflow: this.$store.state.workflow.workflow,
statuses: this.$store.state.workflow.statuses,
newStatuses: []
},
workflowLoaded: false
}
},
computed: {
...mapGetters(['workflow']),
},
methods: {
...mapActions(['editWorkflow']),
editThisWorkflow() {
this.editWorkflow({
id: this.workflowData.id,
workflow: this.workflowData.workflow,
statuses: this.workflowData.statuses,
newStatuses: this.workflowData.newStatuses
})
},
addField() {
this.workflowData.newStatuses.push({ value: ''});
},
deleteField(index) {
this.workflowData.newStatuses.splice(index, 1);
}
这是提交数据的存储方法
editWorkflow(context, workflowData) {
axios.patch('/workflowstatuses/' + workflowData.id, {
workflow: workflowData.workflow,
statuses: workflowData.statuses,
newStatuses: workflowData.newStatuses
})
.then(response => {
context.commit('editWorkflow', response.data)
})
.catch(error => {
console.log(error.response.data)
})
},
我的问题出在这里
data() {
return {
workflowData: {
id: this.$store.state.workflow.id,
workflow: this.$store.state.workflow.workflow,
statuses: this.$store.state.workflow.statuses,
newStatuses: []
},
workflowLoaded: false
}
},
是否有更好的方法来设置此部分?
workflowData: {
id: this.$store.state.workflow.id,
workflow: this.$store.state.workflow.workflow,
statuses: this.$store.state.workflow.statuses,
newStatuses: []
},
答案 0 :(得分:0)
如果只需要一次将存储值分配给表单,则可以使用挂载函数。
mounted: function() {
this.id = this.$store.state.workflow.id
this.workflow = this.$store.state.workflow.workflow
this.statuses = this.$store.state.workflow.statuses
},
data() {
return {
workflowData: {
id: '',
workflow: '',
statuses: '',
newStatuses: []
},
workflowLoaded: false
}
},
答案 1 :(得分:0)
data属性不接受此属性,我通常在此问题中使用箭头函数,因为它禁止我使用它,并且禁止我的团队也在数据中使用它。 在数据中声明所有必要的项目以保持反应性,并在页面的安装范围内分配值。
chrome.webRequest.onHeadersReceived.addListener(details => {
let header = details.responseHeaders.find(e => e.name.toLowerCase() === 'referrer-policy');
// Check if the header has been defined already
if (typeof header !== 'undefined') {
console.log ('Modifying header');
header.value = 'strict-origin';
}
else {
details.responseHeaders.push({ name: 'referrer-policy', value: 'strict-origin' });
}
return {responseHeaders: details.responseHeaders};
}, {urls: ["*://*/*"]}, ['blocking', 'responseHeaders']);
答案 2 :(得分:0)
我解决此问题的方法比这里介绍的大多数解决方案都更简单。由于Vuejs的生命周期,我发现很难从this.$store.state
获取数据。由于"v-model will ignore the initial value, checked or selected attributes found on any form elements. It will always treat the Vue instance data as the source of truth."
v-mode
分配值是不可能的
使用从ajax请求(例如, 电子邮件类型的输入字段,我按如下操作。
1st。。我将ajax请求的输出保存在应用程序的存储区(Cookies)中-可以是Local Storage或Session,具体取决于您的情况。
第二名。我用我的应用程序存储中的数据填充了Vuex's store(single source of truth)。每次重新加载页面时,我都会这样做。
第3次。,而不是在Vuejs生命周期中将数据绑定到v-model
,或使用html输入(<input type="email" value="email@example.com">
)的 value属性。我通过使用来自Vuex商店的数据填充html的 placeholder属性来预填充输入,如下所示:
<input v-model="form.input.email" type="email" name="email" v-bind:placeholder="store.state.user.data.email">