2016-01-19 2 views
2

Я хочу отображать только отдельные элементы на основе переданного идентификатора. Я использую метод подписки и публикации метеор для того же самого, также FlowRouter для маршрутизации. Когда я пытаюсь получить данные с помощью findOne и передаю Id, он не возвращает никаких данных, но когда я нахожу ({}), он получает все данные и отображает их, не уверен, почему findOne не работает.Одиночная подписка не работает в моем коде метеор

Примечание. Я пытаюсь получить запись на основе идентификатора объекта (_id), предоставленного MongoDB.

posts = Mongo.collection("allPosts"); 

<Template name="stdSingleView"> 
    {{#if Template.subscriptionsReady}} 
    {{#with studenthistory}} 
    {{id}} - {{name}} 
    {{/with}} 
    {{else}} 
    Loading.... 
    {{/if}} 
</Template> 

Template.stdSingleView.onCreated(function(){ 
var self = this; 
self.autorun(function(){ 
var Id = FlowRouter.getParam('id'); 
self.subscribe('singlePost', Id); 
}); 
}); 

Template.stdSingleView.helpers({ 
studenthistory: function(){ 
var id= FlowRouter.getParam('id'); 
return posts.findOne({_id: id}); 
} 
}); 

if (Meteor.isServer) { 
Meteor.publish("allposts", function() { 
return posts.find({}); 
}); 

Meteor.publish('singlePost', function(id) { 
check(id, String); 
return posts.find({_id: id}); 
}); 
} 

pages.route('/:id', { 
name: 'singleView', 
action: function(params) { 
BlazeLayout.render('stdSingleView'); 
} 
}); 
+0

Как вы можете 'но когда я действительно нахожу ({}), он получает все данные и отображает его,' с '{{#with studenthistory}}'? –

+0

find тоже работает для меня, но мне нужно найти findOne, так как мне нужно показать только одну запись, которая не работает. Pls видит полный код здесь: https://jsfiddle.net/3s6zL5hg/1/ –

ответ

2

Когда вы findOne с помощью _id, пожалуйста, завернуть его в Нью-Mongo.ObjectID, а затем передать его.

Попробуйте этот код:

Meteor.publish('singleStudent', function(id) { 
    check(id, String); 
    return attendanceRegCol.find({"_id": new Mongo.ObjectID(id)}); 
    }); 

    Template.studentSingleView.helpers({ 
    studenthistory: function(){ 
     var id= FlowRouter.getParam('id'); 
     return attendanceRegCol.findOne({"_id": new Mongo.ObjectID(id)}); 
    } 
}); 
+0

Спасибо Sharath! Работал для меня :) –

+0

странно ... не уверен, почему я никогда не использую это, но он по-прежнему работает с моим проектом +1 –

1

find вернет курсор, содержащий только один документ. Вы должны проходной, что для того, чтобы получить данные, или Вы можете изменить помощник в findOne

Template.stdSingleView.helpers({ 
    studenthistory: function(){ 
     var id= FlowRouter.getParam('id'); 
     return posts.findOne({_id: id}); 
    } 
}); 
+0

Спасибо Tran за ответ. Я сам использовал findOne, но он не работал. Так что переключилось на поиск, пока я вставил код здесь. findOne не работает. –

+0

лучший способ - отлаживать шаги по шагам. Можете ли вы попытаться: распечатать «id» на публикации/распечатать «posts.find ({_ id: id});» в публикации/на странице откройте «консоль Chrome» и введите «сообщения». find(). fetch() ', чтобы увидеть, есть ли какие-либо данные на клиенте? –

+0

HI Я пробовал утешать, posts.find(). Fetch(). И он дает пустой массив. попробовал печать posts.find ({_ id: id}); он показывает объект, а селектор «{{5694f3869e8dfbde5d74438a}}« –

Смежные вопросы