This seems like a fairly basic question but I can't seem to find a definitive (or even working) answer.
I have my root instance:
var vm = new Vue({
el: '#app',
// Data
data: {
events: {}
},
// Methods
methods: {
fetchEvents: function(){
this.$http.get('/api/events').success(function(theseEvents) {
this.$set('events', theseEvents);
}).error(function(error) {
});
}
},
ready: function(){
this.fetchEvents();
}
});
And I have a separate component in which I want to list out the events that are stored in the root instance. At the moment it looks like this:
var EventsList = Vue.extend({
template: '<ul><li v-for="event in events"><h2>{{ event.title }}</h2><p>{{ event.body }}</p></li></ul>',
data: function(){
return {
events: {}
}
},
methods: {
syncEvents: function(){
this.$set('events', this.$parent.events);
}
},
// When ready...
ready: function(){
this.syncEvents();
}
}
This doesn't seem to work. I have also tried this.$root.events
to no avail. What is the correct way to go about this? Bear in mind I want to reference the data from the root, not create a copy with its own scope.
EDIT: trying to use props, here is the list component, which is also not working:
var EventsList = Vue.extend({
template: '<ul><li v-for="event in events"><h2>{{ event.title }}</h2><p>{{ event.body }}</p></li></ul>',
props: ['events']
}
That's what "Props" are for:
http://vuejs.org/guide/components.html#Props
I you pass an object/array as a prop (what your
events
data will surely be), it's two-way syncing automatically - change events in the child, they are changed in the parent.If you pass simple values (strings, numbers - e.g. only event.name) via props, you have to explicitly use the
.sync
modifier: http://vuejs.org/guide/components.html#Prop_Binding_TypesUsing
props
, you can easily pass the same data from parent to children. Since I don't know how you linked the root instance and theEventList
together, I'm going to assume you registered it as a global component.The documentation states:
So you will be using the same object throughout all your components when you pass it as a prop.
EventList:
In the root vue instance template, you can pass the root vue instances
events
as a property calledevents
in the child component: