代码之家  ›  专栏  ›  技术社区  ›  Roubi

未更新Vue.js DOM(将Symfony表单与动态内容集成)

  •  0
  • Roubi  · 技术社区  · 7 年前

    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>
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Simon Hyll    7 年前

    https://vuejs.org/v2/api/#v-html :

    请注意,内容是以纯HTML格式插入的—它们不会编译为Vue模板

    换句话说,既然你在使用 v-html 要加载后端生成的表单,它没有用作Vue模板,只是粘贴为纯HTML,这意味着它将无法像在Vue应用程序中一样绑定到值和更新内容。

    推荐文章