Маршрутизатор не получает объект коллекции для маршрутизации в документ коллекции

Я столкнулся с недавней проблемой, когда у моего маршрутизатора, кажется, нет коллекции для маршрутизации имени.

У меня есть коллекция с именем Nodes. В этой коллекции есть много чтения из многих узлов с различными видами данных в каждом узле. Хотя атрибут имени для этих узлов не уникален (используется simpleSchema). Это тот конкретный узел может отправлять много точек данных. Позже я буду графически эти данные из коллекции. Вставка узлов

var sampleInput_4 ={
    name : "Tulsa Node",  
    longitude : -95.982,
    latitude : 36.137,
    humidity : 78,
    tem p: 80,
    dew : 20,
    pressure : 32,
    speed : 12,
    direction : 60
};

Но таких вставок может быть тысячи. И тысячи разных узлов вставок. Я публикую всю коллекцию узлов и в боковой панели JS файл подписаться на Создан для всей коллекции. это только для проверки этой проблемы. вот файл боковой панели js.

Template.sidebar.helpers({
    nodes: function(){
        var col=  Nodes.find().fetch();
        return _.uniq(_.pluck(col,'name'));
    }
});

Template.sidebar.onCreated(function () {
    this.subscribe('nodes');
});

Это прекрасно работает в HTML, загружая только уникальные имена, как я хочу.

{{#each nodes}}
    <li>
        <a href="{{pathFor 'NodePage'}}">
            {{this}}
        </a>
    </li>
{{/each}}

Однако это не путь, которым я хочу. Там на самом деле нет маршрута, когда я делаю это таким образом. Я хочу, чтобы маршрут был / имя уникального имени. Не имеет значения, какое название какого документа. просто уникальное имя любого из тех, на которые я нажал. Вот роутер

Router.route('/:_id', {
name : 'NodePage',
data : function() { return Nodes.findOne(
        // this refers to the currently matched
        //route.this.params access parts of route
        this.params._id);
    }
});

Хотя, если я поставлю

return Nodes.find();

в боковой панели js файл для возврата работает маршрут. Я пропускаю какой-то фундаментальный аспект железного роутера? Также боковая панель после этого просто возвращает каждый [объект] во всей коллекции. Хотя вы можете нажать на них, и маршрутизатор работает на них.

1 ответ

Оказалось, что Маршрутизатор использует атрибут имени, необходимый для извлечения его из объекта, поэтому я отправил массив объектов через каждый код в HTML. Так что помощнику просто нужно было сформировать массив объектов с уникальными именами для возврата.

Template.sidebar.helpers({
    nodes : function() {
        //make array to hold objects
        var myObjectArray = [];
        // grab entire collection
        var nodeCollection = Nodes.find().fetch();
        // Get the unique names from collection
        var nodeNames = _.uniq(_.pluck(nodeCollection,'name'));
        // find the Node with that name and
        // place into object array loop till done
        for(i = nodeNames.length; i>0; i--){
            var arrayItem = nodeNames[i-1];
            var nodeObject = Nodes.findOne({name: arrayItem});
            myObjectArray.push(nodeObject);
        } 
        return myObjectArray;
    }
});
Другие вопросы по тегам