1

我最近遇到了一个问题,我的路由器似乎没有路由名称的集合。

我有一个名为 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 文件中订阅了 Created 到整个集合。这只是为了测试这个问题。这是侧边栏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}}

但是,这并没有按照我想要的方式进行。当我这样做时,实际上没有路线。我希望路线是 /name 的唯一名称。哪个文件的哪个名称无关紧要。只要它是我点击的那个,它就是任何唯一的名称。这里是路由器

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 文件中用于返回路线有效。我错过了 Iron 路由器的一些基本方面吗?此后的侧边栏也只返回整个集合中的每个 [object]。尽管您可以单击它们,但路由器可以对它们起作用。

4

1 回答 1

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;
    }
});
于 2016-02-28T01:09:10.193 回答