2016-10-20 13 views
0

ユーザーが画像をアップロードできるコンポーネントがありますが、画像を削除する機能も追加したいと思います。私は現在のイメージを削除するボタンを追加しましたが、問題はフォームが提出されていることです、そして、私はそれを避けたいと思います。現在のイメージがあれば削除するだけです。私は、画像を削除した後、再び、それはアップロードされません同じものをアップロードしようとした場合、私は、その後、removeImage方法でevent.preventDefault()を配置してみましたが、しているVueボタンをクリックするとフォームが送信されます

<template> 
    <div class="Image-input"> 
     <div class="Image-input__input-wrapper"> 
      <h2>+</h2> 
      <input @change="previewThumbnail" class="Image-input__input" name="image" type="file"> 
     </div> 

     <div class="Image-input__image-wrapper"> 
      <i v-show="! imageSrc" class="icon fa fa-picture-o"></i> 
      <img v-show="imageSrc" class="Image-input__image" :src="imageSrc"> 
      <button v-show="imageSrc" @click="removeImage">Remove image</button> 
     </div> 
    </div> 
</template> 
<script> 
export default { 

    props: ['imageSrc'], 

    methods: { 
    previewThumbnail: function(event) { 
     var input = event.target; 

     if (input.files && input.files[0]) { 
     var reader = new FileReader(); 

     var vm = this; 

     reader.onload = function(e) { 
      vm.imageSrc = e.target.result; 
     } 

     reader.readAsDataURL(input.files[0]); 
     } 
    }, 
    removeImage: function removeImage(e) { 
     this.imageSrc = ''; 
    } 
    } 
} 
</script> 

:これはスクリプトです。それについて何をすべきか分かりませんか?

+0

試してみてください[イベントモディファイア](https://vuejs.org/guide/events.html#Event-Modifiers) –

+0

イメージを削除してすぐに同じイメージをアップロードしようとしても、アップロードする。他のすべてのシナリオは動作しますが、このシナリオだけが動作しません。 – Marco

+0

問題のJSfiddleを作成できますか? –

答えて

3

フォーム内にボタンがある場合、デフォルトタイプは「submit」です。起きてからそれを防ぐためには、次のようにtype="button"を設定する必要があります:

<button type="button" v-show="imageSrc" @click="removeImage">Remove image</button> 

参考:Can I make a <button> not submit a form?

編集:#5

に#1のコメントで述べた第二の問題のためのソリューションreader.onloadの機能を次のように変更してください:

reader.onload = function(e) { 
    vm.imageSrc = e.target.result; 
    console.log("Clearing file input"); 
    document.querySelectorAll('input[type=file]').forEach(element => { 
     element.value = ""; 
    }); 
} 

ご覧のとおり、コンソールログを出力してデバッグ(これを削除できます)し、次にすべてのファイル入力を選択してその値をリセットします。選択したファイルがクリアされます。

注:このクリア機能は、ファイルをメモリに読み込んだ後に発生します。削除機能でそれをしたい場合は、次のように行うことができます:

removeImage: function removeImage(e) { 
    this.imageSrc = ""; 
    console.log("Clearing file input"); 
    document.querySelectorAll('input[type=file]').forEach(element => { 
     element.value = ""; 
    }); 
} 

選択はあなた次第です、あなたはメモリに、またはあなたが画面上にそれを維持したい場合は読んだ後、ファイル名をクリアするかどうか。それが動作するかどうか私に教えてください!

別のメモ:あなたのアプリに他の<input type="file">がある場合、それでもクリアされます。しかし、私はそれをメモリに読み込んで、それをいくつかのローカル変数に保存していたと仮定します。これを避けるには、document.querySelectorAll関数を修正して、クラスまたはIDを指定して関連する入力のみを対象にする必要があります。

+0

はい、ありがとうございます!しかし、私はイメージを削除してすぐに同じイメージをアップロードしようとすると別の問題が発生します。まだアップロードされません。他のすべてのシナリオは動作しますが、このシナリオだけが動作しません。 – Marco

+0

はい、私はローカルで問題を再現することができました。あなたのコードをローカルファイルにコピーし、preview.Humbnail()関数の最初の行として 'console.log("新しい画像を取得 ");を追加しました。これで、2回目の試行が期待通りに機能していないことを確認できます。私が解決策を見つけることができれば戻ってくるだろう。 – Mani

+0

私は見ることができます、古いファイルは "選択"として保持され、最初のファイル名が表示されます。必要なのは、画像をデータURLとして読み込んだ後にフォームを消去する方法です。 – Mani

関連する問題