Iron Router、集合助手和会话变量。如何在 javascript 函数中调用项目属性

Iron Router, Collection Helpers, and Session Variables. How to call an item attribute in a javascript function

我正在开发一个 Meteor 应用程序,并试图将集合中某个项目的属性传递给 javascript 函数。在这种情况下,我使用 instafeed.js,一个用于 instagram API 的 javascript 插件,但我想在更基本的层面上理解这个过程。

我已经能够将我的 Teams 集合中的记录拉入 /teams/:id route,并使用 {{name}}{{igHandle}} 模板助手显示团队的属性。

我也能够使用 etjana:instafeed and the demo 在线提供的这个包 instafeed.js 来工作。我正在拉取的标签是通过以下方式静态分配的:Session.setDefault(‘tagName’,’football’); 最终我想提取用户配置文件,但这需要来自 oauth2 的访问令牌。我认为这可以通过 {{$.Session.get access_token}} handlebar helper 来实现,但我需要先想办法将变量输入 instafeed.js 函数。

谁能解释一下如何将 {{igHandle}} 属性传递给 javascript 函数中的 tagName。我的代码如下:

团队模板:

<template name="teamView">
    <div class=“ui container”>
        <h3>{{name}}</h3>
                <p>
            <i class="fa fa-instagram fa-lg"></i>
            <a target="_blank" href="http://instagram.com/{{insta_hndl}}">&nbsp{{insta_hndl}}</a>
            </p>
            <br>
            <h3>Instagrams</h3>
            {{> igTeamFeed}}
    </div>
</template>

一切正常,除了 {{>igTeamFeed}} 渲染。我能够获取要显示的内容,但它目前是静态的。 (通过(Session.setDefault('tagValue','football')分配。

Instafeed 模板:

<template name="igTeamFeed">
  <div class="ui container”>
    <h3>@{{insta_hndl}} Instagram</h3>
    <div id="instafeed"></div>
  </div>
</template>

正在显示内容,但同样只能通过静态 (Session.setDefault('tagValue','football') 代码显示。

路由器:

Router.route('/teams/:_id', {
    name: 'teamView',
    template: 'teamView',
    data: function(){
        var currentTeam = this.params._id;
        return Teams.findOne({ _id: currentTeam });
    },
    action: function() {
        if (this.ready()) {
            this.render('teamView');
        } else {
            this.render('loading');
        }
    }
});

与模板助手一起工作,所以我认为我在这里没问题。还按照我的 .

用户的说明进行操作

Instafeed Javascipt:(需要一些工作)

Template.igTeamFeed.helpers ({
  igData: function() {
    return Session.get('insta_hndl');
  },
});

Template.igTeamFeed.onRendered(function () {
    //clear any previously stored data making the call
    Session.get('insta_hndl'); //extra add-in
    Session.set('insta_hndl', null);
    Session.set('insta_hndl', this.data.insta_hndl); //extra add-in

    var igHandle = this.data.insta_hndl;

});

Tracker.autorun(function(){
    feed = new Instafeed({
        get: 'tagged',
        tagName: Session.get('insta_hndl'),
        clientId: ‘xxxxxxxxxxxxxxxxxxx’,
        resolution: 'thumbnail',
        sortBy: 'most-liked',
        limit: '15'
    });

    feed.run();
});

如何解决 这些是我认为可以解决这个问题的一些方法。请建议如何执行此操作/您认为最佳做法是什么:

如果有人可以帮助我完成这项工作,那就太好了,但解释会更好!真的花了很多时间在这上面,很多在线资源都在使用贬值的语法。

另外两个相关问题问题:

我应该使用控制器吗?我应该单独写一个控制器吗?或者只是将它包含在 Router.route 函数中?看到有些人严重依赖controller,但是很多文档都是通过Router.route.

搞定的

我应该将 instafeed 功能分解成 method 吗?如果是这样,我应该怎么做?我花了很多时间尝试将整个 instafeed 功能设置为服务器端方法,但似乎无法让它工作。我只预见到自己会在一个或两个其他模板中使用此功能,所以我认为保留原样很好。请指教

抱歉,这有点令人困惑。正确的 javascript 是:

Template.igTeamFeed.helpers ({
    teams: function() {
    return Teams.find();
  }
});

Template.igTeamFeed.onCreated( function() {

    var igHandle = Teams.findOne(Router.current().params._id).insta_hndl;

    feed = new Instafeed({
        get: 'tagged',
        tagName: Session.get('insta_hndl'),
        clientId: ‘xxxxxxxxxxxxxxxxxxx’,
        resolution: 'thumbnail',
        sortBy: 'most-liked',
        limit: '15'
    });

    feed.run(); //run the new Instafeed({})
});

我建议的任何事情都不需要。可以使用 Collection.findOne(Router.current().params._id).attrib 获取属性,其中 Collection 是您的集合,attrib 是您要获取的 non-_id 值。

也不需要tracker.autorun,那也让我失望了。