Как получить доступ к подпискам FlowRouter в помощниках шаблона Meteor?

похоже, я не могу получить доступ к подписке на шаблон FlowRouter в моем помощнике. Как вы можете это сделать?

В моем коде сервера:

Meteor.publish('AllUsers', function() {
    return Meteor.users.find({}, {fields: {profile: 1}});
})

В моем коде маршрутизатора:

var userRoutes = FlowRouter.group({
    subscriptions: function(params, queryParams) {
        this.register('AllUsers', Meteor.subscribe('AllUsers'));
    },
});

В моем коде шаблона:

{{#if checkFlowRouterSubs}}
    {{#each getTheUsers}}
        {{>userPartial}}
    {{/each}}
{{/if}}

В моих помощниках у меня есть «охранник»:

checkFlowRouterSubs: function() {
    if (FlowRouter.subsReady()) {
        return true;
    };
    return false;
},

А затем хелпер getTheUsers:

...
var users = AllUsers.find(filterObject, { sort: { 'profile.firstname': 1 } }).fetch(); // the actual query definitely works
...

Но я получаю сообщение об ошибке:

Exception in template helper: ReferenceError: AllUsers is not defined

Я должен отметить, что в помощнике getTheUsers FlowRouter.subsReady('AllUsers') возвращает true


person Zach Smith    schedule 05.03.2016    source источник


Ответы (2)


Итак, во-первых, это:

var userRoutes = FlowRouter.group({
    subscriptions: function(params, queryParams) {
        this.register('AllUsers', Meteor.subscribe('AllUsers'));
    },
});

НЕ является кодом сервера: это код клиента: Flow-router является маршрутизатором на стороне клиента: нелогично, но это основа всех этих маршрутизаторов. Подсказка здесь в том, что вы «подписываетесь» на публикацию в этом коде, поэтому она находится на стороне клиента.

Iron-Router выполняет маршрутизацию как на стороне сервера, так и на стороне клиента, поэтому, когда вы заходите оттуда, все становится еще более запутанным.

Здесь вам не хватает функции publish на стороне сервера.

Meteor.publish('AllUsers', function() {
    return AllUsers.find();
});

РЕДАКТИРОВАТЬ:

Ошибка

Exception in template helper: ReferenceError: AllUsers is not defined похоже, потому что вы не определили коллекцию на стороне клиента

var AllUsers = Mongo.Collection('AllUsers'); //or whatever the actual collection

person MrE    schedule 05.03.2016
comment
Спасибо за ответ. Извиняюсь за эту ошибку - у меня действительно есть это в коде моего сервера. я изменил вопрос - person Zach Smith; 05.03.2016
comment
похоже, что ваша коллекция не определена на стороне клиента. - person MrE; 06.03.2016
comment
Спасибо наверное в этом причина. Я предполагаю, что вам все еще нужно локальное хранилище на стороне клиента для опубликованной коллекции. - person Zach Smith; 06.03.2016

Когда вы пытаетесь получить данные из подписки, вы хотите вызвать фактическую коллекцию, для которой вы хотите получить данные, а не имя подписки. В данном случае, я думаю, вы имеете в виду Meteor.users:

var users = Meteor.users.find(filterObject, { sort: { 'profile.firstname': 1 } });
if( users ) {
  return users.fetch();
}
person Stephen Woods    schedule 05.03.2016
comment
Спасибо. Иногда я получаю неопределенную ошибку, когда делаю это в помощнике, даже при использовании охранника. - person Zach Smith; 06.03.2016