2

I'm trying to display some html entities in a form text input, but v-model seems escaping them.

Is there something I need to write to make v-model displaying correctly html entities?

my sample code is

<el-input v-model="data" readonly="readonly"></el-input>

I know about v-html but I prefer keep using v-model due the automatic two-way binding.

UPDATE

Maybe I expressed myself wrong, I want to display the character, not the html entity, so instead 49.42&#8377; i need to display 49.42₹.

fudo
  • 2,254
  • 4
  • 22
  • 44
  • Take a look at this https://stackoverflow.com/questions/44376484/how-to-do-databind-two-way-in-v-html – niclas_4 Nov 13 '18 at 13:50
  • And what does `data` contain? [This fiddle](https://jsfiddle.net/djpgsbzq/) seems to handle HTML just fine in an `el-input`. – Roy J Nov 13 '18 at 14:30
  • @Badgy the user there "falled back" to manually write two-way data binding with `v-html`, if possible I would like to keep `v-model` to not writing any method myself to do this – fudo Nov 13 '18 at 14:45
  • @RoyJ `data` contains a monetized value, i.e.: number followed by currency symbol expressed with html entity – fudo Nov 13 '18 at 14:46
  • You want to interpret the HTML entity in a text input field? Do you expect to be able to reverse-translate from currency symbol to entity notation? – Roy J Nov 14 '18 at 00:35

1 Answers1

3

If you v-model a computed that interprets HTML entities, I think you get the effect you want. You can type in entity values and it will interpret them correctly. However, it might prematurely turn &#8 into a different character; you have to type #8377; and then go back in and insert the &.

new Vue({
  el: '#app',
  data: {
    a: '49.42&#8377;'
  },
  computed: {
    asText: {
      get() {
        return this.toText(this.a);
      },
      set(newValue) {
        this.a = newValue;
      }
    }
  },
  methods: {
    toText(html) {
      const div = document.createElement('div');

      div.innerHTML = html;
      return div.textContent;
    }
  }
})
<link href="//unpkg.com/element-ui@1.0.0-rc.3/lib/theme-default/index.css" rel="stylesheet"/>
<script src="//unpkg.com/vue/dist/vue.js"></script>
<script src="//unpkg.com/element-ui/lib/index.js"></script>

<div id="app">
  <el-input v-model="asText"></el-input>
  {{a}}
  <div v-html="a"></div>
</div>
Roy J
  • 42,522
  • 10
  • 78
  • 102