<div id="app"> <ul class="users"> <li class="user" v-repeat="users" v-transition> <span>{{name}} - {{email}}</span> <button v-on="click:removeUser(this)">X</button> </li> </ul> <form id="form" v-on="submit:addUser"> <input v-model="newUser.name | nameValidator | capitalize"> <input v-model="newUser.email | emailValidator"> <input type="submit" value="Add User"> </form> <ul class="errors"> <li v-show="!validation.name">Name cannot be empty.</li> <li v-show="!validation.email">Please provide a valid email address.</li> </ul> </div>
var baseURL = 'https://vue-demo.firebaseIO.com/', Users = new Firebase(baseURL + 'users'), emailRE = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ Users.on('child_added', function (snapshot) { var item = snapshot.val() item.id = snapshot.name() app.users.push(item) }) Users.on('child_removed', function (snapshot) { var id = snapshot.name() app.users.some(function (user) { if (user.id === id) { app.users.remove(user) return true } }) }) var app = new Vue({ el: '#app', filters: { nameValidator: function (val) { this.validation.name = !!val return val }, emailValidator: function (val) { this.validation.email = emailRE.test(val) return val } }, data: { users: [], newUser: { name: '', email: '' }, validation: { name: false, email: false } }, methods: { addUser: function (e) { e.preventDefault() console.log(this) if (this.validation.name && this.validation.email) { Users.push(this.newUser) this.newUser = {} } }, removeUser: function (user) { new Firebase(baseURL + 'users/' + user.id).remove() } } })
#app { font-family: 'Helvetica Neue', Arial, sans-serif; font-size: 13px; padding-left: 15px; } .users { padding: 0; } .user { height: 30px; line-height: 30px; padding: 10px; border-top: 1px solid #eee; overflow: hidden; transition: all .25s ease; } .user:first-child { border-top: none; } .user:last-child { border-bottom: 1px solid #eee; } .v-enter, .v-leave { height: 0; padding-top: 0; padding-bottom: 0; border-top-width: 0; border-bottom-width: 0; } .errors { color: #f00; padding-left: 1.5em; }