通过模板访问流星集合
Accessing meteor collection through template
我正在尝试访问模板上流星集合的内容。第一步是搜索,允许应用程序显示名为 players 的 Mongo 集合中的特定项目,然后当您单击该项目时,它会将您带到 showPerson 显示那些项目内容的页面。到目前为止,我已经能够进行搜索,但是当您单击某个项目时,它会呈现新页面但不会填充数据。
我已经尝试过这里的答案,但无法弄清楚我做错了什么。
此外,如果您在 <template name="search">
中注意到我有 __originalId
。我也试过 _id
和 id
但仍然没有成功。说到 ID,它们之间有什么区别?
我的额外包裹是
easy:search
aldeed:collection2
aldeed:autoform
kadira:flow-router
kadira:blaze-layout
arillo:flow-router-helpers
我还安装了 autopublish 和 insecure,所以我想这不是订阅问题??
免责声明——我是 meteor 的新手,javascript 所以请随意撕开它并握住我的手:)
我的html是
搜索选项
<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>
应该显示内容的页面
<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>
我的Javascript是
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.
}
});
还有我的路线
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');
}
});
如果有帮助,请看两张截图
Home page with search
showPerson page
数据库和架构
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 ()
});
您的 showPerson 模板没有显示任何数据,因为您没有向它提供任何数据。
您应该从集合中获取与路由 /players/:_id
中给定的 id 相匹配的玩家数据
阅读 https://guide.meteor.com 以获取更多信息。
首先用 {{#with}}
包装您的 showPerson
模板
<template name="showPerson">
{{#with person}}
<h1>Show Person Details: {{name}}</h1>
<div class="row">
name: {{name}}
</div>
//etc...
{{/with}}
</template>
然后添加一个助手来为 {{#with}}
:
提供数据
Template.showPerson.helpers({
person() {
return Players.findOne(FlowRouter.getParam('_id'));
}
});
我正在尝试访问模板上流星集合的内容。第一步是搜索,允许应用程序显示名为 players 的 Mongo 集合中的特定项目,然后当您单击该项目时,它会将您带到 showPerson 显示那些项目内容的页面。到目前为止,我已经能够进行搜索,但是当您单击某个项目时,它会呈现新页面但不会填充数据。
我已经尝试过这里的答案,但无法弄清楚我做错了什么。
此外,如果您在 <template name="search">
中注意到我有 __originalId
。我也试过 _id
和 id
但仍然没有成功。说到 ID,它们之间有什么区别?
我的额外包裹是
easy:search
aldeed:collection2
aldeed:autoform
kadira:flow-router
kadira:blaze-layout
arillo:flow-router-helpers
我还安装了 autopublish 和 insecure,所以我想这不是订阅问题??
免责声明——我是 meteor 的新手,javascript 所以请随意撕开它并握住我的手:)
我的html是
搜索选项
<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>
应该显示内容的页面
<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>
我的Javascript是
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.
}
});
还有我的路线
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');
}
});
如果有帮助,请看两张截图
Home page with search
showPerson page
数据库和架构
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 ()
});
您的 showPerson 模板没有显示任何数据,因为您没有向它提供任何数据。 您应该从集合中获取与路由 /players/:_id
中给定的 id 相匹配的玩家数据阅读 https://guide.meteor.com 以获取更多信息。
首先用 {{#with}}
showPerson
模板
<template name="showPerson">
{{#with person}}
<h1>Show Person Details: {{name}}</h1>
<div class="row">
name: {{name}}
</div>
//etc...
{{/with}}
</template>
然后添加一个助手来为 {{#with}}
:
Template.showPerson.helpers({
person() {
return Players.findOne(FlowRouter.getParam('_id'));
}
});