2016-04-20 20 views
0

Ich bin neu bei Meteor und versuche, dieses Problem herauszufinden, das ich habe.Meteor + MongoDB: Wie bekomme ich verschachtelte Daten?

Ich versuche, Daten aus der Lessons-Sammlung basierend auf der Route, die übergeben wird, zu laden. Wenn zum Beispiel/courses/level1/lection1/1a übergeben wird, dann zeige Daten

Leider funktioniert das nicht.

Bin ich auf dem richtigen Weg oder gibt es einen besseren Weg?

Sammlung

{ 
    "_id": "YSgr3fvjpEBn7ncRa", 
    "courseId": "level1", 
    "lesson": [ 
    { 
     "lessonId": "lesson1", 
     "freeLesson": true, 
     "title": "Lesson 1", 
     "eachLesson": [ 
     { 
      "eachLessonId": "1a", 
      "title": "This is (masculine)", 
      "video": "839843" 
     }, 
     { 
      "eachLessonId": "1b", 
      "title": "That is (masculine)", 
      "video": "839843" 
     }, 
     { 
      "eachLessonId": "1c", 
      "title": "This is (feminine)", 
      "video": "839843" 
     }, 
     { 
      "eachLessonId": "1d", 
      "title": "That is (feminine)", 
      "video": "839843" 
     }, 
     { 
      "eachLessonId": "1e", 
      "title": "Getting to know you", 
      "video": "839843" 
     } 
     ] 
    } 
    ] 
} 

Routen

Router.route("courses/:courseId/:lessonId/:eachLessonId", { 
    path:"/courses/:courseId/:lessonId/:eachLessonId", 
    layoutTemplate: "layoutLessons", 
    template:"lessons", 
    onBeforeAction:function(){ 
    var currentUser = Meteor.userId(); 
    if (currentUser) { 
     Session.set('courseId', this.params.courseId); 
     Session.set('lessonId', this.params.lessonId); 
     Session.set('eachLessonId', this.params.eachLessonId); 
     this.next(); 
    } else { 
     Router.go('/') 
    } 
    }, 
}); 

Template Helfer

Template.lessons.onCreated(function(){ 
    Meteor.subscribe('listLessons'); 
}); 


Template.lessons.helpers({ 
    currentLesson: function() { 
    var currentLesson = Session.get('eachLessonId'); 
    return Lessons.find({"lesson.eachLesson.eachLessonId" : currentLesson}); 
    }, 
}); 

HTML

{{#each currentLesson}} 
    {{title}} 
    {{video}} 
{{/each}} 

Antwort

1

Statt Speicherung courseId, lessonId und eachLessonId als Session Werte, könnten Sie die verwenden Iron Router'swaitOn und data Option.

Zum Beispiel könnten Sie Ihre Route wie folgt umschreiben:

Router.route('/courses/:courseId/:lessonId/:eachLessonId', { 
    name: 'lessons', 
    layoutTemplate: 'layoutLessons', 
    template: 'lessons', 
    onBeforeAction: function() { 
    let currentUser = Meteor.user(); 
    if (currentUser) this.next(); 
    else Router.go('/'); 
    }, 
    data: function() { 
    var doc = Lessons.findOne({ 
     "courseId": this.params.courseId, 
     "lesson.lessonId": this.params.lessonId, 
     "lesson.eachLesson.eachLessonId": this.params.eachLessonId 
    }); 
    if (doc) { 
     var lesson = {}; 
     var lessonId = this.params.eachLessonId; 
     _.each(doc.lesson, function(i) { 
     lesson = _.find(i.eachLesson, function(j) { 
      return j.eachLessonId == lessonId; 
     }); 
     }); 
     return lesson; 
    } 
    return {}; 
    }, 
    waitOn: function() { 
    return [ 
     Meteor.subscribe('lesson', this.params.courseId, this.params.lessonId, this.params.eachLessonId) 
    ]; 
    } 
}); 

Diese den Datenkontext zu dem angeforderten eachLesson Objekt setzen soll. Sie können jedoch in Betracht ziehen, den Datenkontext auf ein Dokument in der Lessons-Sammlung zu setzen und dann bestimmte eachLesson Objekte auszuwählen. Darüber hinaus sollten Sie eine Veröffentlichungsfunktion erstellen, die nur das angeforderte Dokument Lessons zurückgibt und nicht alle, wie Sie es wahrscheinlich jetzt in Ihrer Publikation listLessons tun. Sie können alle IDs als Argumente an die entsprechende Veröffentlichungsfunktion übergeben.

+0

Es funktioniert! :-) Das einzige Problem ist, dass es nach dem Einlesen der Daten kontinuierlich geladen wird. Also, wenn ich waitOn zu Abonnements ändere: es lädt die Daten und der Ladetext ist immer noch da und wenn ich waitOn verlasse lädt es keine Daten und lädt einfach weiter. – user1400803

+0

@ user1400803 Okay, das ist nicht gut. Könnten Sie bitte das Server/Client-Protokoll überprüfen? –

+0

@ user1400803 Könnten Sie bitte Ihre Veröffentlichungsfunktion veröffentlichen? –

Verwandte Themen