javascript - 铁路由器,集合帮助器和 session 变量。如何在JavaScript函数中调用item属性

标签 javascript session meteor collections iron-router

我正在开发Meteor应用程序,并试图将集合中的项目属性传递给javascript函数。在这种情况下,我使用instagram API的JavaScript插件instafeed.js进行工作,但我想从更基础的角度理解该过程。

我已经能够将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吗?如果是这样,我该怎么做?我花了大量时间tryig将整个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是您要获取的非_id值。

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

关于javascript - 铁路由器,集合帮助器和 session 变量。如何在JavaScript函数中调用item属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32063805/

相关文章:

canvas - 带有 Fabric Canvas 的 FileSaver.js

javascript - ES6 箭头表示法与 Jquery filter() 的关系?

javascript - 设置 18 岁的年龄限制 - Bootstrap Datepicker

android - 从 Android Webview 获取 session

react-native - 如何在 react-native-webview 中保持最后一个 Web session 处于事件状态?

javascript - 如何在 Meteor 中从服务器动态更新网页?

javascript - TypeError : Cannot read property 'addTopic' of undefined. 我是瞎子吗?

javascript - 如何将表行映射为 typescript 中不同接口(interface)的潜在行?

php - 如何正确启动和销毁 session ?

javascript - 使用模板加载作为服务器方法 Meteor js 的触发器