2017-05-27 10 views
0

私はVue.jsの新しい学習者で、公式ガイドラインに例(example of currency filter)を実装しようとしています。Vue.jsのコンポーネントの双方向バインディングの使用

ただし、実装する際には、コンポーネント(value)のプロパティの名前を(priceValue)に変更します。変更後、入力ボックスは値を書式設定できません。書式付きの値ではなく常に「0」と表示されます。

私が作成した唯一の変更です。何が問題ですか? DOCSによれば

Vue.component('currency-input', { 
 
    template: '\ 
 
    <div>\ 
 
     <label v-if="label">{{ label }}</label>\ 
 
     $\ 
 
     <input\ 
 
     ref="input"\ 
 
     v-bind:value="priceValue"\ 
 
     v-on:input="updateValue($event.target.value)"\ 
 
     v-on:focus="selectAll"\ 
 
     v-on:blur="formatValue"\ 
 
     >\ 
 
    </div>\ 
 
    ', 
 
    props: { 
 
    priceValue: { 
 
     type: Number, 
 
     default: 0 
 
    }, 
 
    label: { 
 
     type: String, 
 
     default: '' 
 
    } 
 
    }, 
 
    mounted: function() { 
 
    this.formatValue() 
 
    }, 
 
    methods: { 
 
    updateValue: function (value) { 
 
     var result = currencyValidator.parse(value, this.priceValue) 
 
     if (result.warning) { 
 
     this.$refs.input.value = result.value 
 
     } 
 
     this.$emit('input', result.value) 
 
    }, 
 
    formatValue: function() { 
 
     // console log here always get 0 
 
     this.$refs.input.value = currencyValidator.format(this.priceValue) 
 
    }, 
 
    selectAll: function (event) { 
 
     setTimeout(function() { 
 
     \t event.target.select() 
 
     }, 0) 
 
    } 
 
    } 
 
}) 
 

 
new Vue({ 
 
    el: '#app', 
 
    data: { 
 
    price: 0, 
 
    shipping: 0, 
 
    handling: 0, 
 
    discount: 0 
 
    }, 
 
    computed: { 
 
    total: function() { 
 
     return ((
 
     this.price * 100 + 
 
     this.shipping * 100 + 
 
     this.handling * 100 - 
 
     this.discount * 100 
 
    )/100).toFixed(2) 
 
    } 
 
    } 
 
})
<script src="https://unpkg.com/vue/dist/vue.js"></script> 
 
<script src="https://cdn.rawgit.com/chrisvfritz/5f0a639590d6e648933416f90ba7ae4e/raw/98739fb8ac6779cb2da11aaa9ab6032e52f3be00/currency-validator.js"></script> 
 

 
<div id="app"> 
 
    <currency-input 
 
    label="Price" 
 
    v-model="price" 
 
    ></currency-input> 
 
    <currency-input 
 
    label="Shipping" 
 
    v-model="shipping" 
 
    ></currency-input> 
 
    <currency-input 
 
    label="Handling" 
 
    v-model="handling" 
 
    ></currency-input> 
 
    <currency-input 
 
    label="Discount" 
 
    v-model="discount" 
 
    ></currency-input> 
 
    
 
    <p>Total: ${{ total }}</p> 
 
</div>

答えて

0

v-modelで動作するコンポーネントについて

、それは(これらは2.2.0+に 構成することができる)べきである。

  • を受け入れるvalue小道
  • これはmodelオプションブロックと sinse 2.2.xでは設定することができます

新しい値でinputイベントを発する:あなたのコード、所定の位置にこれにより

Vue.component('currency-input', { 
    model: { 
    prop: 'propValue', 
    // event: 'input' - you can also customize event name, not needed in your case 
    }, 

をしますもう一度作業してください:https://jsfiddle.net/wostex/j3a616a5/

関連する問題