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}}"> {{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();
});
- 我有一个帮手来获取会话的当前
insta_hndl
。 session项通过url的team/:_id
标签传递,在router 中定义
onRendered
正在擦掉旧手柄,插入新手柄。我添加了两个额外的 Session.get
和 Session.set
函数,因为我收到 insta_hndl
未定义的错误(与我之前的 post 的响应不同)。那里可能是错的。
tracker.autorun
函数是我在 instafeed 示例中使用的代码。应该在别的地方吗?也许在 helper
或 onRendered
函数中?我还需要 tracker.autorun
才能使用 instafeed 吗?据我了解,它会在 tagName
更改时动态更新 Feed,但是没有其他方法可以做到这一点吗?
如何解决
这些是我认为可以解决这个问题的一些方法。请建议如何执行此操作/您认为最佳做法是什么:
- 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
函数中?看到有些人严重依赖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,那也让我失望了。
我正在开发一个 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}}"> {{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();
});
- 我有一个帮手来获取会话的当前
insta_hndl
。 session项通过url的team/:_id
标签传递,在router 中定义
onRendered
正在擦掉旧手柄,插入新手柄。我添加了两个额外的Session.get
和Session.set
函数,因为我收到insta_hndl
未定义的错误(与我之前的 post 的响应不同)。那里可能是错的。tracker.autorun
函数是我在 instafeed 示例中使用的代码。应该在别的地方吗?也许在helper
或onRendered
函数中?我还需要tracker.autorun
才能使用 instafeed 吗?据我了解,它会在tagName
更改时动态更新 Feed,但是没有其他方法可以做到这一点吗?
如何解决 这些是我认为可以解决这个问题的一些方法。请建议如何执行此操作/您认为最佳做法是什么:
- 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
函数中?看到有些人严重依赖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,那也让我失望了。