2016-11-01 5 views
0

Ich versuche, den Inhalt einer Meteor-Sammlung auf einer Vorlage zuzugreifen. Der erste Schritt ist eine Suche, die es der App ermöglicht, bestimmte Artikel aus der Mongo-Sammlung Spieler anzuzeigen. Wenn Sie dann auf den Artikel klicken, gelangen Sie zur Seite showPerson, auf der der Inhalt dieser Artikel angezeigt wird. Bisher konnte ich die Suche zum Laufen bringen, aber wenn Sie auf ein Element klicken, wird die neue Seite gerendert, aber es werden keine Daten hinzugefügt.Zugriff auf Meteor-Sammlung durch Vorlage

Ich habe versucht, hier Antworten durchzugehen, aber ich konnte nicht herausfinden, was ich falsch mache.

Auch wenn Sie in <template name="search"> bemerken, habe ich __originalId. Ich habe auch versucht _id und id aber immer noch keinen Erfolg. Apropos ID ist was ist der Unterschied zwischen diesen?

Und meine Extra-Pakete sind

easy:search 
aldeed:collection2 
aldeed:autoform 
kadira:flow-router 
kadira:blaze-layout 
arillo:flow-router-helpers 

ich auch noch autopublish haben und unsicher installiert, so dass ich denke, es ist kein Abonnement Problem ??

Disclaimer - ich bin neu Meteor und Javascript, so wenden Sie sich bitte diese auseinander reißen und meine Hand halten :)

Mein html ist

Suchoptionen

<template name="search"> 
    {{> EasySearch.Input index=playersIndex}} 

    <ul> 
    {{#EasySearch.Each index=playersIndex}} 
     <li>Name of the player: <a href="{{pathFor 'showPerson'}}/{{__originalId}} ">{{name}}</a> {{name}} Score of the Player: ({{score}})</li> 
    {{/EasySearch.Each}} 
    </ul> 

    {{> EasySearch.LoadMore index=playersIndex}} 

    {{#EasySearch.IfNoResults index=playersIndex}} 
    <div class="no-results">No results found!</div> 
    {{/EasySearch.IfNoResults}} 
</template> 

Seite das soll Inhalt anzeigen

<template name="showPerson"> 
    <h1>Show Person Details: {{name}}</h1> 
    <div class="row"> 
name: {{name}} 
    </div> 
    <div class="row"> 
    score: {{score}} 
    </div> 
    <div class="row"> 
    age: {{age}} 
    </div> 
</template> 

Mein Javascript ist

Tracker.autorun(function() { 
    let cursor = PlayersIndex.search('Marie'); // search all docs that contain "Marie" in the name or score field 

    console.log(cursor.fetch()); // log found documents with default search limit 
    console.log(cursor.count()); // log count of all found documents 
}); 


Template.search.helpers({ 
    playersIndex:() => PlayersIndex // instanceof EasySearch.Index 
    }); 


Template.update.helpers({ 
    exampleDoc: function() { 
     return Players.findOne(); 
    } 
}); 



Template.myMenu.helpers({ 
    items: function(){ 
    return MyCollection.find(); 
    } 
}); 


Template.myMenu.events({ 
    'onChange #mySelect': function(ev){ 
    ...handle the event. 
    } 
}); 

Und meine Routen

FlowRouter.route('/', { 

    action: function() { 
    BlazeLayout.render("home"); 
    } 
}); 



FlowRouter.route('/players/:_id', { 
    name: "showPerson", 
    action: function(params) { 
    console.log(params._id); 

    BlazeLayout.render('showPerson'); 
    } 
}); 

FlowRouter.route('/hello', { 
    action: function() { 
    BlazeLayout.render('hello'); 
    } 
}); 

Und wenn es hilft hier zwei Screenshots

Home page with search

showPerson page

Datenbank und das Schema

Players = new Mongo.Collection('players'); 

PlayersSchema = new SimpleSchema({ 
    "name": { 
    type: String, 
    label: "Business Name" 
    }, 
    "address": { 
    type: String, 
    label: "Address" 
    }, 
    "website": { 
    type: String, 
    label: "Website", 
    optional: true 
    }, 
} 
Players.attachSchema(PlayersSchema); 



PlayersIndex = new EasySearch.Index({ 
    collection: Players, 
    fields: ['name', 'score'], 
    engine: new EasySearch.MongoDB() 
}); 

Antwort

0

Zuerst wickeln Sie Ihre showPerson Vorlage mit einem {{#with}}

<template name="showPerson"> 
{{#with person}} 
    <h1>Show Person Details: {{name}}</h1> 
    <div class="row"> 
    name: {{name}} 
    </div> 
    //etc... 
{{/with}} 
</template> 

Dann fügen Sie einen Helfer die Daten für die {{#with}} zu bieten:

Template.showPerson.helpers({ 
    person() { 
    return Players.findOne(FlowRouter.getParam('_id')); 
    } 
}); 
+0

Danke. Diese Antwort funktioniert perfekt. Ich habe allerdings eine Frage. Wenn ich __originalID benutze, erhalte ich die Ergebnisse als 'zc3SpXvua3qCiibCJ' und erhalte Ergebnisse auf der Seite, aber wenn ich _id benutze, erhalte ich nichts und die Konsole druckt die ID in einem komischen Format' zc3SpXvua3qCiibCJ "" {} 'warum ist das. Der einzige Grund, den ich frage, ist, weil alle Beispiele, die ich sehe, _id anstelle von __originalID verwenden –

+0

Können Sie einige Beispieldaten von Ihrer Ansammlung zeigen? '_id' ist die standardmäßige eindeutige ID, die automatisch für alle Sammlungen erstellt wird. '_originalID' hat in Meteor afaik keine besondere Bedeutung. –

+0

Ich habe es am Ende meiner Frage hinzugefügt –

0

Ihre showPerson-Vorlage zeigt keine Daten an, da Sie keine Daten angeben. Sie sollten die Spielerdaten aus der Sammlung abrufen, die mit der in der Route/players/angegebenen ID übereinstimmen: _ id

Gehen Sie zu https://guide.meteor.com, um weitere Informationen zu erhalten.

+0

Danke. Ich habe etwas mehr gelernt. –

Verwandte Themen