我正在开发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}}"> {{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
吗?如果是这样,我该怎么做?我花了大量时间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/