2015-07-02 4 views
0

Я пытаюсь реализовать базовый маршрут, используя Flow Router. Но независимо от того, что я запрашиваю у сборника; Я всегда получаю информацию о первом документе в своей коллекции - «Запросы».Невозможно прочитать слизень с URL-адреса на Flow Router (Meteor)

Так вот мое определение маршрута в файле /lib/routes.js:

FlowRouter.route('/requests/:reqId', { 
    subscriptions: function (params, queryParams) { 
    this.register('theRequest', Meteor.subscribe('singleRequest', params.reqId)); 
    }, 
    action: function (params, queryParams) { 
    FlowLayout.render('layout', { aside: 'aside', main: 'singleRequest' }); 
    console.log("Yeah! We are on the post:", params.reqId); 
    }, 
    name: 'aRequest' 
}); 

Вот мой помощник:

Template.singleRequest.helpers({ 
    getRequest: function() { 
     return Requests.findOne(); 
    } 
}); 

Вот мой сервер публикует:

Meteor.publish('singleRequest', function (reqId) { 
    return Requests.find({ _id: reqId}); 
}); 

И вот шаблон:

<template name="singleRequest"> 
    {{#if isSubReady 'theRequest'}} 
    {{#with getRequest}} 
     <h2>{{_id}}</h2> 
     <p>{{reqFrom}}</p> 
     <p>{{reqBy}}</p> 
    {{/with}} 
    {{else}} 
    loading... 
    {{/if}} 
</template> 

Что я делаю неправильно? Примечание: В консоли я вижу правку 'reqId' slug из-за команды console.log в определении маршрута. Но я не вижу соответствующей информации для документа, к которому он принадлежит.

Спасибо!

ответ

1

ОК, моя проблема была в том, что у меня была еще одна подписка, где я опубликовал все Запросы, а не только тот, у кого есть определенный _id. И поскольку я не создал помощника, чтобы получить только тот, у кого есть определенный _id; конечно, сервер просто отправил мне самый первый запрос.

Мое решение было только подписаться на предыдущей подписки и определить в помощнике, чтобы принести к запросу _id:

FlowRouter.route('/requests/:reqId', { 
    subscriptions: function (params, queryParams) { 
    this.register('allRequests', Meteor.subscribe('Requests', params.reqId)); 
    }, 
    action: function (params, queryParams) { 
    FlowLayout.render('layout', { aside: 'aside', main: 'singleRequest' }); 
    console.log("Yeah! We are on the post:", params.reqId); 
    }, 
    name: 'aRequest' 
}); 

и помощнику:

Template.singleRequest.helpers({ 
    getRequest: function() { 
    var reqId = FlowRouter.getParam("reqId") 
    return Requests.findOne({_id:reqId}); 
    }  
}); 
0

Я считаю, что ваш код правильный для того, что вы пытаетесь сделать. Тем не менее, я выхожу из вашей прямой репликации кода из потока-маршрутизатора, что вы довольно новичок в Meteor. Поэтому я готов взять пунт, что у вас все еще есть пакет autopublish в вашем приложении.

Autopublish подталкивает все данные в вашей коллекции к клиенту. Даже без вызова публикации/подписки.

Вы можете сделать две вещи. Чтобы сохранить autopublish (что сделает процесс разработки проще в начале, но, может быть, труднее позже), просто измените свой помощник шаблон для:

Template.singleRequest.helpers({ 
    getRequest: function() { 
     return Requests.findOne({ _id: FlowRouter.getParam("reqId")}); 
    } 
}); 

В качестве альтернативы (и вы хотите сделать это в конце концов), дойдя до командная строка и введите:

meteor remove autopublish 

Вы можете прочитать о преимуществах и недостатках autopublish во многих местах, чтобы сделать свое собственное решение, какой вариант лучше всего подходит для вас. Однако вы также должны подумать, хотите ли вы в будущем кэшировать свои данные (например, с помощью subsManager), чтобы вы могли захотеть изменить свой помощник шаблона независимо.

+0

Спасибо за ответ! Тем не менее, у меня уже снят пакет autopublish. Также я все еще пытался использовать ваш код, и он не работал:/ – Emo

+0

Хммм. Как вы определяете свою коллекцию 'Requests'? И сколько документов в вашей коллекции? Если вы пишете 'FlowRouter.getParam (« reqId »)' на консоли во время вашего помощника, что вы видите - идентификатор, который вы ищете (на вашем маршруте), идентификатор первого документа или ничего/нуль? –

+0

Привет снова. На самом деле я нашел решение. Но до этого - ответ на ваш вопрос: да, я получил слизню. Спасибо Дункан! – Emo

1

Для тех, кто просматривает этот вопрос ищет как получить Flow Router для захвата и динамической привязки к слизнякам из db, а затем вызвать страницу шаблона для каждого элемента, я сделал очень простое примерное приложение и разместил его на here on GitHub.

Надеюсь, что это поможет кому-то.