【发布时间】:2017-05-05 12:35:46
【问题描述】:
这个问题类似于VueJS re-compile HTML in an inline-template component 和How to make Vue js directive working in an appended html element
不幸的是,该问题中的解决方案不能再用于当前的 VueJS 实现,因为 $compile 已被删除。
我的用例如下:
我必须使用第三方代码来操纵页面并在之后触发事件。现在,在该事件被触发后,我想让 VueJS 知道它应该重新初始化当前的 DOM。
(使用纯 javascript 编写的第三方允许用户向页面添加新的小部件)
https://jsfiddle.net/5y8c0u2k/
HTML
<div id="app">
<my-input inline-template>
<div class="wrapper">
My inline template<br>
<input v-model="value">
<my-element inline-template :value="value">
<button v-text="value" @click="click"></button>
</my-element>
</div>
</my-input>
</div>
Javascript - VueJS 2.2
Vue.component('my-input', {
data() {
return {
value: 1000
};
}
});
Vue.component('my-element', {
props: {
value: String
},
methods: {
click() {
console.log('Clicked the button');
}
}
});
new Vue({
el: '#app',
});
// Pseudo code
setInterval(() => {
// Third party library adds html:
var newContent = document.createElement('div');
newContent.innerHTML = `<my-element inline-template :value="value">
<button v-text="value" @click="click"></button>
</my-element>`; document.querySelector('.wrapper').appendChild(newContent)
//
// How would I now reinialize the app or
// the wrapping component to use the click handler and value?
//
}, 5000)
【问题讨论】:
-
新代码可以绝对显示在页面的任何位置吗?
-
是的,有多个动态生成的位置。我找到了解决方案,但感觉更像是 hack:jsfiddle.net/9ukmy0k0
-
黑客行为是不可避免的:你违反了与 Vue 控制 DOM 的合同。
-
这是大型项目和现有解决方案的痛点——你无法控制一切:(
-
您想要
my-elements 共享的my-input的当前状态吗?这可能不那么骇人听闻。 jsfiddle.net/9ukmy0k0/2
标签: javascript html vue.js