2014-09-10 3 views
0

У меня есть приложение «back end», которое записывается в MongoDb (в базе данных у меня есть _id: с ObjectId («13f6ea ... 002»)). Я использую приложение meteor для отображения информации. Все было хорошо, я показываю список информации с помощью {{#each}}. Но когда я хотел показать один элемент с «_Id», ничего не работает.Как показать данные из mongoDB с ObjectID

Я прочитал this issue и адаптирую свой код, чтобы получить правильный корень, но я не могу ничего отобразить на странице. Я пытался писать шаблонов хелперы, но это не помогло

Db запись:

{ 
_id: ObjectId("13f6ea...002"), 
url: "foo", 
title: "bar", 
published: "2014-08-22 03:26:21 UTC", 
image: "foo.jpg", 
summary: "foo ", 
categories: [ 
    "F", 
    "B" 
    ], 
    ... 
    } 

Маршрут:

this.route('news', { 
path: '/news/:_id', 
template: 'news', 
waitOn: function() { 
    var id = this._id; 
    Meteor.subscribe('news', id); 
}, 
data: function() { 
    var id = this.params._id; 
    return News.findOne({ _id: Meteor.Collection.ObjectID(this.params._id)}); 
}, 
action : function() {this.render();}, 
}); 

Опубликовать

Meteor.publish('news', function(id) { 
    return News.find({_id: id}); 
}); 

шаблона, который перенаправляет на уникальный пост

<h4><a href="{{pathFor 'news' _id=this._id.toHexString}}">{{title}}</a></h4> 

И шаблон просто {{news}}

Как я могу это исправить?


UPDATE

Мои решения поправим:

router.js

waitOn: function() { 
    var id = this._id; 
    Meteor.subscribe('News', id); 
}, 
data: function() { 
    return News.findOne(new Meteor.Collection.ObjectID(this.params._id)); 
}, 

и в шаблоне

<a href="news/{{_id._str}}">

ответ

1

Перейдите к соответствующему URL-адресу в вашем браузере (т. localhost:3000/news/[_id]), откройте консоль и введите:

Router.current().data() 

Это покажет вам контекст данных текущего маршрута. Либо он ничего не возвращает, и в этом случае возникает фундаментальная проблема с вашим запросом News.findOne, поскольку он ничего не возвращает, или (более вероятно) он возвращает требуемый документ.

В последнем случае, насколько я вижу, в этом документе нет свойства news, поэтому он ничего не делает. Если вы измените {{news}} на {{url}} или {{summary}} Я бы предположил, что это предоставит запрашиваемое имущество.

Если по {{news}} вы пытаетесь вынести весь документ, а затем (в сторону от того, что она будет оказывать как нечто вроде [Object]) вам нужно сделать news это свойство объекта, возвращенного вашей функции данных:

return { 
    news: News.findOne({ _id: Meteor.Collection.ObjectID(this.params._id)}); 
}; 
+0

Спасибо, что для вашего ответа вы правы, я получаю «undefined». Но не могу понять, что не так с моим .findOne – yan

+0

Получаете ли вы результат, если вы просто запускаете тот же запрос 'findOne' с консоли? Если у вас есть атрибут 'data', определенный в вашем контроллере маршрутов (если он у вас есть), я думаю, что это переопределит контекст, установленный в самом маршруте, но если ваш запрос ничего не возвращает при запуске в консоли, то это где ваша проблема есть. – richsilv

+0

Я получаю 'TypeError: this.params undefined' У меня есть waitOn (не уверен, что мне нужно) и функция данных в моем маршруте, как я написал выше. – yan

0

Получение документа с _id: В.js файл в событиях, Сообщать о событии click и Collection EventList: -

'Submit form' : function() { 
     var id = this._id;  
     return EventList.find({_id : id}).fetch(); 
    } 

Это вернет объект для идентификатора. В моем случае я показываю поле для всех документов в коллекции. Пользователь выбирает запись и нажимает кнопку «Отправить», которая извлекает все поля «Документ» и выводит на экран Пользователь

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