1

最近、ルーターが名前をルーティングするためのコレクションを持っていないように見えるという問題に遭遇しました。

ノードという名前のコレクションがあります。このコレクションには、各ノードにさまざまな種類のデータがある多くのノードからの読み取りが多数あります。これらのノードの name 属性は一意ではありませんが (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 ルーターの基本的な側面が欠けていますか? また、この後のサイドバーは、コレクション全体のすべての [オブジェクト] を返します。これらをクリックすることはできますが、ルーターはそれらで動作します。

4

1 に答える 1

1

ルーターが name 属性を使用してオブジェクトからプルする必要があることが判明したため、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 に答える