【发布时间】: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}}"> {{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.get和Session.set函数,因为我收到insta_hndl未定义的错误(与我上一篇文章的回复不同)。那里可能是错的。 -
tracker.autorun函数是我使用 instafeed 示例的代码。它应该在其他地方吗?也许在helper或onRendered函数中?我还需要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