Ниже приведен пример для пользовательского веб-компонента my-input
. Я хотел бы связать атрибут value моего пользовательского компонента ввода с атрибутом email экземпляра vue. (В примере может потребоваться, чтобы Chrome поддерживал пользовательские веб-компоненты.)
=> Как мне настроить пример веб-компонента, чтобы привязка работала?
Если я заменим my-input
на простой тег input
, то переплет будет работать. Поэтому мой синтаксис для части vue.js, кажется, просто отлично.
https://jsfiddle.net/j5f9edjt/
new Vue({
el: '#app',
template: '#app-template',
data: {
//email data is blank initially
email: ''
}
})
<script type="text/javascript" src="https://unpkg.com/vue@2.2.4"></script>
<script>
class MyInput extends HTMLElement {
static get observedAttributes() {
return ['value'];
}
constructor(){
super();
this.wrappedInput=undefined;
}
connectedCallback(){
var self=this;
if(!self.wrappedInput){
var wrappedInput = document.createElement('input');
wrappedInput.type='text';
wrappedInput.onchange = ()=>this.wrappedInputChanged();
self.appendChild(wrappedInput);
self.wrappedInput = wrappedInput;
}
}
attributeChangedCallback(attr, oldValue, newValue) {
if(attr==='value'){
console.log('attribute changed ' + newValue);
if(this.wrappedInput){
this.wrappedInput.value= newValue;
}
}
}
wrappedInputChanged(){
console.log('wrapepd input changed')
var newValue = this.wrappedInput.value;
this.value = newValue;
}
get value() {
console.log('get value')
return this.getAttribute('value');
}
set value(newValue) {
this.setAttribute('value',newValue);
console.log('set value ' + newValue);
}
}
window.customElements.define('my-input', MyInput);
</script>
<div id="app"></div>
<template id="app-template">
<div>
<my-input v-model="email"></my-input>
<h1>
You entered {{email}}
</h1>
</div>
</template>
Я пытался отправить дополнительное событие ввода, но это не помогло:
var myInput = new CustomEvent("input",
{
detail: {
message: "Hello World!",
type: 'text',
},
bubbles: true,
cancelable: true
}
);
this.dispatchEvent(myInput);
Где найти исходный код директивы v-model, чтобы понять, что она делает?
Похожие вопросы:
Как настроить целевой элемент (собственный веб-компонент) в vue.js?