vue component
加载整个表单生成的后端
Symfony/Twig
现在,我试着让它和
动态场
(比如说国家/城市):当你选择
在表单的一个输入中,ajax调用更新
城市
'输入。
我被困在最后一步。我得到了我更新字段的html,我替换了
输入这个新对象,
但变化不会出现在教堂里
下面是我组件的代码。在
initializeDynamicFields()
方法(在代码的底部),在
ajax
调用,我所做的替换不会像我希望的那样更新DOM。
dynamicFieldParent
和
dynamicFieldChild
我在两者中都调用这个方法
mounted()
updated()
.
编辑问题解决了:我在ajax回调函数中调用组件的属性,而不是事先将其a内容存储到变量中。
<template>
<div class="card bg-light border-dark">
<div class="card-body">
<h3 v-if="title" class="card-title">{{ title }}</h3>
<div v-html="content" v-on:click.capture="handleClick"></div>
<!--<div ref="body" v-on:click.capture="handleClick"></div>-->
</div>
</div>
</template>
<script type="text/babel">
var formSerialize = require('form-serialize');
export default {
name: "dynamic-form",
props: ['url', 'dynamicFieldParent', 'dynamicFieldChild'],
data() {
return {
title: '',
content: '',
components: null
};
},
created() {
this.load(this.url);
},
mounted() {
if (this.dynamicFieldParent) {
this.initializeDynamicFields();
}
},
updated() {
if (this.dynamicFieldParent) {
this.initializeDynamicFields();
}
},
methods: {
load(url) {
axios.get(url, {
headers: {'X-Requested-With': 'XMLHttpRequest'}
}).then(response => {
this.title = response.data.title;
this.content = response.data.content;
this.components = response.data.components;
});
},
handleClick(e) {
if (e.target.tagName == 'BUTTON' && e.target.type == 'submit' && e.target.form.checkValidity()) {
this.submit(e);
}
},
submit(e) {
e.preventDefault();
this.$root.$emit('form-sending');
let data = formSerialize(e.target.form, {
hash: false, empty: true
});
data += '&' + e.target.name + '='
+ encodeURIComponent(e.target.value);
axios.post(this.url, data, {
headers: {'X-Requested-With': 'XMLHttpRequest'}
}).then(response => {
this.title = response.data.title;
this.content = response.data.content;
this.components = response.data.components;
if (response.status == 201) {
this.$root.$emit('form-success');
}
});
},
initializeDynamicFields() {
var $parent = $('#' + this.dynamicFieldParent);
var $child = $('#' + this.dynamicFieldChild);
$parent.change(function() {
var $form = $parent.closest('form');
var formData = new FormData();
formData.set($parent.attr('name'), $parent.val());
axios.post($form.attr('action'), formData).then(response => {
$child.replaceWith(
response.data.content.find('#' + this.dynamicFieldChild)
);
});
});
}
}
}
</script>