【问题标题】:Iron Router, Collection Helpers, and Session Variables. How to call an item attribute in a javascript functionIron Router、集合助手和会话变量。如何在javascript函数中调用项目属性
【发布时间】:2015-11-10 21:10:13
【问题描述】:

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

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

我还可以使用这个包etjana:instafeed 和在线提供的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');
        }
    }
});

适用于模板助手,所以我想我在这里还可以。还要按照我的prior posts 之一的用户的说明进行操作。

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();
});
  • 我有一个助手可以获取当前会话的insta_hndl。会话项通过url的team/:_id标签传递,并在路由器中定义
  • onRendered 正在清除旧手柄,并插入新手柄。我添加了两个额外的Session.getSession.set 函数,因为我收到insta_hndl 未定义的错误(与我上一篇文章的回复不同)。那里可能是错的。
  • tracker.autorun 函数是我使用 instafeed 示例的代码。它应该在其他地方吗?也许在helperonRendered 函数中?我还需要tracker.autorun 才能使用instafeed 吗?据我了解,它会在 tagName 更改时动态更新提要,但没有其他方法可以做到这一点吗?

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

  • Collection Helpers:我想我可以打电话给Teams.findOne().insta_hndl,但运气不好。那是正确的代码块吗?是否必须在模板助手中定义变量,还是可以直接在feed js函数中调用?
  • Handlebars Helpers:我想我可以使用 Session 助手做一些事情,但不确定如果一个用户打开了两个不同的 instafeed 实例(打开两个选项卡并选择了不同的团队),它是否可以工作。
  • Reactive Methods:允许在 Tracker.autorun 中同步调用方法。以为我读到了一些说 Meteor 已经内置了这个功能的东西,但请指教。
  • Iron Router Query:我的一部分仍然不相信 insta_hndl 没有通过。我已经探索过将 instagram 句柄作为查询参数添加到 URL,但我认为这不是最佳做法。

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

还有两个相关的问题:

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

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

【问题讨论】:

  • 读完后我很困惑!你能分解一点点,把重点放在问题上吗?

标签: javascript session meteor collections iron-router


【解决方案1】:

抱歉,这有点令人困惑。正确的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 是你要抓取的非_id值。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 2015-01-14
    • 1970-01-01
    • 2016-11-18
    相关资源
    最近更新 更多