2017-12-15 25 views
0

私はvue.jsの新人です。私は完成したチュートリアルを拡張しようとしています。 今この3時間で戦っていて、私はイライラしています。参考までに、私はfirebaseを使用していますが、私は本当にここで重要なのか分かりません。Vue.js追加と編集と同じフォーム

私はムービーを掲載するためのCRUDアプリを持っています(私は基本的だと言っていました)。 ムービーを追加できるページの上部にフォームがあり、その下に新しいレジストリがリストされているテーブルがあります。これはうまくいく。

テーブルの各行に[編集]と[削除]ボタンを追加しました。 delete関数が機能します。しかし、編集機能が問題です。

最初のフォームでv-ifを使い、別のメソッド(保存、編集)を起動し、異なるボタン(追加、保存、キャンセル)を表示したいと思います。

これを行うためにオブジェクトにアクセスする方法がわかりません。私はいくつかのことを試しましたが、v-ifはオブジェクトが定義されていないと言います。

読んでいただきありがとうございます、必要なものをお尋ねください。

import './firebase' // this has my credententials and initializeApp 
 
import Vue from 'vue' 
 
import App from './App' 
 
import VueFire from 'vuefire' 
 

 
Vue.use(VueFire) 
 
Vue.config.productionTip = false 
 

 
/* eslint-disable no-new */ 
 
new Vue({ 
 
    el: '#app', 
 
    template: '<App/>', 
 
    components: { App } 
 
})
<template> 
 
    <div id="app" class="container"> 
 
    <div class="page-header"> 
 
     <h1>Vue Movies</h1> 
 
    </div> 
 
    
 
    <div class="panel panel-default"> 
 
     <div class="panel-heading"> 
 
     <h3>Add Movie</h3> 
 
     </div> 
 
    
 
     <div class="panel-body"> 
 

 
     <div v-if="!isEditing"> 
 
      <form id="form" class="form-inline" v-on:submit.prevent="addMovie"> 
 
      <div class="form-group"> 
 
       <label for="movieTitle">Title:</label> 
 
       <input type="text" id="movieTitle" class="form-control" v-model="newMovie.title"> 
 
      </div> 
 
      <div class="form-group"> 
 
       <label for="movieDirector">Director:</label> 
 
       <input type="text" id="movieDirector" class="form-control" v-model="newMovie.director"> 
 
      </div> 
 
      <div class="form-group"> 
 
       <label for="movieUrl">URL:</label> 
 
       <input type="text" id="movieUrl" class="form-control" v-model="newMovie.url"> 
 
      </div> 
 
      <input type="submit" class="btn btn-primary" value="Add Movie"> 
 
      </form> 
 
     </div> 
 

 
     <div v-else> 
 
      <form id="form" class="form-inline" v-on:submit.prevent="saveEdit(movie)"> 
 
      <div class="form-group"> 
 
       <label for="movieTitle">Title:</label> 
 
       <input type="text" id="movieTitle" class="form-control" v-model="movie.title"> 
 
      </div> 
 
      <div class="form-group"> 
 
       <label for="movieDirector">Director:</label> 
 
       <input type="text" id="movieDirector" class="form-control" v-model="movie.director"> 
 
      </div> 
 
      <div class="form-group"> 
 
       <label for="movieUrl">URL:</label> 
 
       <input type="text" id="movieUrl" class="form-control" v-model="movie.url"> 
 
      </div> 
 
      <input type="submit" class="btn btn-primary" value="Save"> 
 
      <button v-on:click="cancelEdit(movie['.key'])">Cancel</button> 
 
      </form> 
 
     </div> 
 

 
     </div> 
 

 
    </div> 
 
    
 
    <div class="panel panel-default"> 
 
     <div class="panel-heading"> 
 
     <h3>Movies List</h3> 
 
     </div> 
 
     <div class="panel-body"> 
 
     <table class="table table-stripped"> 
 
      <thead> 
 
      <tr> 
 
       <th>Title</th> 
 
       <th>director</th> 
 
      </tr> 
 
      </thead> 
 
      <tbody> 
 
      <tr v-for="movie in movies"> 
 

 
       <td> 
 
       <a v-bind:href="movie.url" v-bind:key="movie['.key']" target="_blank">{{movie.title}}</a> 
 
       </td> 
 
       <td> 
 
       {{movie.director}} 
 
       </td> 
 
       <td> 
 
       <button v-on:click="editMovie(movie)">Edit</button> 
 
       </td> 
 
       <td> 
 
       <button v-on:click="removeMovie(movie)">Remove</button> 
 
       </td> 
 

 
      </tr> 
 
      </tbody> 
 
     </table> 
 
     </div> 
 
    </div> 
 
    </div> 
 
</template> 
 

 
<script> 
 

 
import { moviesRef } from './firebase' 
 

 
export default { 
 
    name: 'app', 
 
    firebase: { 
 
    movies: moviesRef 
 
    }, 
 
    data() { 
 
    return { 
 
     isEditing: false, // maybe this helps? 
 
     newMovie: { 
 
     title: '', 
 
     director: '', 
 
     url: 'http://', 
 
     edit: false // or maybe this?? 
 
     } 
 
    } 
 
    }, 
 
    methods: { 
 
    addMovie: function() { 
 
     moviesRef.push(this.newMovie) 
 
     this.newMovie.title = '', 
 
     this.newMovie.director = '', 
 
     this.newMovie.url = 'http://' 
 
     this.newMovie.edit = false 
 
    }, 
 
    editMovie: function (movie){ 
 
     moviesRef.child(movie['.key']).update({ edit:true }); // can't access this one with v-if, not sure why 
 
     //this.newMovie = movie; 
 
    }, 
 
    removeMovie: function (movie) { 
 
     moviesRef.child(movie['.key']).remove() 
 
    }, 
 
    cancelEdit(key){ 
 
     moviesRef.child(key).update({ edit:false }) 
 
    }, 
 
    saveEdit(movie){ 
 
     const key = movie['key']; 
 
     moviesRef.child(key).set({ 
 
     title : movie.title, 
 
     director : movie.director, 
 
     url  : movie.url, 
 
     edit  : movie.edit 
 
     }) 
 
    } 
 
    } 
 
} 
 

 
</script> 
 

 
<style> 
 
#app { 
 
    font-family: 'Avenir', Helvetica, Arial, sans-serif; 
 
    -webkit-font-smoothing: antialiased; 
 
    -moz-osx-font-smoothing: grayscale; 
 
    text-align: center; 
 
    color: #2c3e50; 
 
    margin-top: 60px; 
 
} 
 
</style>

答えて

1

Editボタンをクリックするときには、trueにisEditingを変更する必要があり、あなたはデータmovieを定義する必要があります。

editMovie: function (movie){ 
    ... 
    this.movie = Vue.util.extend({}, movie); // deep clone to prevent modify the original object 
    this.isEditing = true; 
}, 
+0

おかげ 私の方法は次のようになり、今 editMovie:機能(動画){ moviesRef.child(映画[ 'キー。'])更新({編集:真}); //this.newMovie = movie; this.movi​​e = Vue.util.extend({}、movie); //元のオブジェクトを変更しないようにするには深いクローン this.isEditing = true; }、 コンソールでは、「Uncaught ReferenceError:Vueが定義されていません」と表示されます。 – kilinkis

+0

Vueを.vueファイルにインポートしていません。 'vue 'からのVueのインポート – Ben

+0

私はmain.jsファイルの「vue'からVueをインポートします。その蜂は十分ではありませんか? とにかく、本当に助けとなったのは、データオブジェクトにムービーを追加することでした。今私のv-ifが動作します:) 私はisEditingを使用しませんでしたが、movie.edit。 – kilinkis

0

コメント(Benによる)で提案されているように、ムービー宣言を初期データオブジェクトに追加しました。だから今、それは次のようになります。今

data() { 
 
    return { 
 
     isEditing: false, 
 
     newMovie: { 
 
     title: '', 
 
     director: '', 
 
     url: 'http://', 
 
     edit: false 
 
     }, 
 
     movie: { 
 
     edit: false 
 
     } 
 
    } 
 
    },

作品だけで結構V-場合、次のように:

が必要でなくなったん "の編集である" ので、私はそれを削除しました。あなたの答えのための

関連する問題