<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;
}