2017-09-28 2 views
2

Mon modèle de composant contient le code de case à cocher suivantes:Exportation VueJS-rendu HTML avec case à cocher ne parvient pas à préserver l'état vérifié

<div ref="htmlData"> 
    <input 
     type="checkbox" 
     class="mycb" 
     :id="uniqID" 
     :disabled="disabled" 
     v-model="cbvalue" 
    > 
</div> 

(pièces démontées pour la simplicité).

Je dois créer un fichier PDF à partir de ce modèle (sur le serveur). C'est ce que je fais dans le code:

methods : { 
    save() { 
     let saveData = { 
       'html': this.$refs.htmlData.innerHTML 
      }; 
     this.$http.post('/api/save',saveData); 
    } 
} 

Cependant, le HTML enregistré ne contient pas état de case à cocher, il enregistre toujours une case cochée.

Voici un jsfiddle légèrement modifié.

Ma question est: comment puis-je capturer l'état de la case à cocher dans le HTML rendu?

J'ai essayé d'ajouter :checked="cbvalue" prop - pas de chance

+0

J'ai 2 questions pour vous, d'abord pourquoi vous pousser HTML vers le serveur? Le deuxième état de VueJS est avec le DOM virtuel, http://jsfiddle.net/yMv7y/3533/ J'ai modifié quelque chose que vous ne verrez pas mon nom avec le texte de type d'entrée aussi bien ... ma suggestion sera pousser les données JSON au serveur, utiliser le modèle pour lier vos données. –

+0

1. J'ai besoin de convertir html en pdf et je ne connais pas une bonne bibliothèque JS qui peut le faire du côté client. 2. Je veux éviter toute autre analyse sur le serveur puisque les modèles HTML peuvent varier. certains utilisent des cases à cocher, d'autres non, et je ne veux pas installer un moteur de rendu côté serveur complet pour résoudre ce petit problème. – andrei

Répondre

3

On dirait qu'il n'y a aucun moyen de lier l'attribut checked d'une entrée; Vue fait tout à travers la propriété. (Pour référence, la propriété est l'état interne, l'attribut est ce qui apparaît dans le code HTML.)

Pour que l'attribut reflète la propriété, vous pouvez ajouter une petite directive.

var demo = new Vue({ 
 
    el: '#demo', 
 
    data:() => ({ 
 
    val: false 
 
    }), 
 
    methods: { 
 
    save() { 
 
     console.log(this.$refs.main.innerHTML); 
 
    } 
 
    }, 
 
    directives: { 
 
    explicitChecked: { 
 
     update(el) { 
 
     if (el.checked) { 
 
      el.setAttribute('checked', 'checked'); 
 
     } else { 
 
      el.removeAttribute('checked'); 
 
     } 
 
     } 
 
    } 
 
    } 
 
})
<script src="//cdnjs.cloudflare.com/ajax/libs/vue/2.4.2/vue.min.js"></script> 
 
<div id="demo"> 
 
    <button @click="save">save</button> 
 
    <div ref="main"> 
 
    <input type="checkbox" v-model="val" v-explicit-checked> 
 
    </div> 
 
</div>