I am struggling with getting an object in a nested array from firebase using angularfire.
The structure looks like this:
users {
<user1-key>{
events{
<event-key>{
title: "event 1",
tasks: {
<task-key>{
title: "task 1",
isChecked: false
},
<task-key>{
title: "task 2",
isChecked: false
}
}
}
}
},
<user 2-key>{
events{
<event-key>{
title: "event 1",
tasks: {
<task-key>{
title: "task 1",
isChecked: false
},
<task-key>{
title: "task 2",
isChecked: false
}
}
}
}
}
}
I have a service that fetches items from firebase based on users:
app.factory("Events", function ($firebaseObject, $firebaseArray, baseUrl) {
ref = new Firebase(baseUrl);
refAuth = ref.getAuth();
events = $firebaseArray(ref.child("users/" + refAuth.uid + "/events"));
return {
all: function() {
return events;
},
get: function (eventId) {
for (var i = 0; i < events.length; i++) {
if (events[i].$id === eventId) {
return events[i];
}
}
},
getTasks: function(eventId){
for (var i = 0; i < events.length; i++) {
if (events[i].$id === eventId) {
return events[i].tasks;
}
}
},
getInnerTask: function(eventId, taskId){
for (var i = 0; i < events.length; i++) {
if (events[i].$id === eventId) {
event = events[i];
for(var j = 0; j < event.tasks.length; j++){
if(event.tasks[j].$id === taskId){
return event.tasks[j];
}
}
}
}
}
};
});
now in my service I am able to get events as well as a single event. but I cannot seem to be able to get a single task. only list the tasks. in getInnerTask I am using nested for loops in the hope that I can get the id in a similar way to getting the event ids but it is not working.
here is my controller for the single event:
app.controller("EventsInnerCtrl", function ($scope, $firebaseArray,$firebaseObject, $stateParams, Events) {
$scope.event = Events.get($stateParams.eventId);
$scope.tasks = Events.getTasks($stateParams.eventId);
console.log($scope.tasks);
$scope.clickTask = function(){
$scope.task = Events.getInnerTask($stateParams.taskId);
console.log($scope.task); // this returns "Undefined"
}
});
Its worth noting that my events output looks like this:
and my tasks out put looks different (Lacks the $id field in output):
getInnerTask: function(eventId, taskId) {
for (var i = 0; i < events.length; i++) {
if (events[i].$id === eventId) {
event = events[i];
for (var j = 0; j < event.tasks.length; j++) {
if (event.tasks[j].$id === taskId) {
return event.tasks[j];
}
}
}
}
}
My guess is event
is not in the current scope, may be you are not able to access it... how about using var
keyword with event
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.