Meteor:来自外部 API 调用的数据未呈现
Meteor: Data from External API call not rendering
我对 Meteor 比较陌生,我正在尝试为我的 sister-in-law 创建一个网上商店,从她现有的 Etsy 商店获取数据并在其上放置自定义皮肤。我已经定义了我所有的 Meteor.methods 来检索数据,并且我已经用一系列 console.log 语句验证了数据......所以,数据在那里,但它不会呈现屏幕上。以下是服务器端部分代码的示例:
Meteor.methods({
...
'getShopSections': function() {
this.unblock();
var URL = baseURL + "/sections?api_key="+apiKey;
var response = Meteor.http.get(URL).data.results;
return response;
}
...
});
这个方法returns一个Object的数组。 JSON 字符串的示例位来自数组返回的 Object 之一:
{
active_listing_count: 20,
rank: 2,
shop_section_id: 1******0,
title: "Example Title",
user_id: 2******7
}
顺利获取此数据后,我准备从客户端发起调用,我尝试了几种不同的方式但都失败了,然后 Google 搜索让我找到了这里的教程:https://dzone.com/articles/integrating-external-apis-your
在客户端,我有一个 nav.js 文件,其中包含以下代码,改编自上述教程:
Template.nav.rendered = function() {
Meteor.call('getShopSections', function(err, res) {
Session.set('sections', res);
return res;
});
};
Template.nav.helpers({
category: function() {
var sections = Session.get('sections');
return sections;
}
});
还有来自我的 nav.html 模板中的示例调用...
<ul>
{{#each category}}
<li>{{category.title}}</li>
{{/each}}
</ul>
因此,这里发生了一些我不确定的事情。首先,尽管显示了适当数量的 li
占位符,DOM 并未呈现任何 category.title 字符串。其次,在我按照上面的教程进行操作之前,我没有定义 Session 变量。考虑到加载模板后商店类别列表应保持静态,根据我对 Session 变量的理解,我认为没有必要...但出于某种原因,这是模板显示之间的区别单个空 <li>
标记与多个空 <li>
等于 category.length --- 所以,即使我无法理解为什么需要 Session 变量在这种情况下,它确实使我更接近我的目标......我在客户端尝试了一些 console.log 语句,我 100% 确定数据已定义且可用,但是当我在我的开发者工具 window 中检查了源代码,DOM 只显示了一些空的 li
括号。
任何 Meteor 专家都可以解释为什么 1) DOM 没有呈现任何标题,以及 2) 如果确实需要 Session 变量?如果需要更多信息,请告诉我,我很乐意提供。谢谢!
您在使用#each 时设置了数据上下文,因此只需使用:
<li>{{title}}</li>
在不知道你在做什么的情况下很难确定 Session 是否是在这里使用的正确类型的反应变量,但我粗略的猜测是 Mini Mongo 集合可能更适合什么看来你在做。
为了让您开始确定用于此目的的反应变量的正确类型,请转到 full Meteor documentation 并调查:集合、会话和反应变量。
编辑:退一步澄清一下,模板助手称为反应式计算。只有在它们各自的模板中使用并且在计算中使用反应变量时,助手内部的反应式计算才会执行。反应变量有多种类型,每种都有自己的属性。在您使用 Session 之前,您的代码可能根本不起作用,因为您没有使用反应变量。
我对 Meteor 比较陌生,我正在尝试为我的 sister-in-law 创建一个网上商店,从她现有的 Etsy 商店获取数据并在其上放置自定义皮肤。我已经定义了我所有的 Meteor.methods 来检索数据,并且我已经用一系列 console.log 语句验证了数据......所以,数据在那里,但它不会呈现屏幕上。以下是服务器端部分代码的示例:
Meteor.methods({
...
'getShopSections': function() {
this.unblock();
var URL = baseURL + "/sections?api_key="+apiKey;
var response = Meteor.http.get(URL).data.results;
return response;
}
...
});
这个方法returns一个Object的数组。 JSON 字符串的示例位来自数组返回的 Object 之一:
{
active_listing_count: 20,
rank: 2,
shop_section_id: 1******0,
title: "Example Title",
user_id: 2******7
}
顺利获取此数据后,我准备从客户端发起调用,我尝试了几种不同的方式但都失败了,然后 Google 搜索让我找到了这里的教程:https://dzone.com/articles/integrating-external-apis-your
在客户端,我有一个 nav.js 文件,其中包含以下代码,改编自上述教程:
Template.nav.rendered = function() {
Meteor.call('getShopSections', function(err, res) {
Session.set('sections', res);
return res;
});
};
Template.nav.helpers({
category: function() {
var sections = Session.get('sections');
return sections;
}
});
还有来自我的 nav.html 模板中的示例调用...
<ul>
{{#each category}}
<li>{{category.title}}</li>
{{/each}}
</ul>
因此,这里发生了一些我不确定的事情。首先,尽管显示了适当数量的 li
占位符,DOM 并未呈现任何 category.title 字符串。其次,在我按照上面的教程进行操作之前,我没有定义 Session 变量。考虑到加载模板后商店类别列表应保持静态,根据我对 Session 变量的理解,我认为没有必要...但出于某种原因,这是模板显示之间的区别单个空 <li>
标记与多个空 <li>
等于 category.length --- 所以,即使我无法理解为什么需要 Session 变量在这种情况下,它确实使我更接近我的目标......我在客户端尝试了一些 console.log 语句,我 100% 确定数据已定义且可用,但是当我在我的开发者工具 window 中检查了源代码,DOM 只显示了一些空的 li
括号。
任何 Meteor 专家都可以解释为什么 1) DOM 没有呈现任何标题,以及 2) 如果确实需要 Session 变量?如果需要更多信息,请告诉我,我很乐意提供。谢谢!
您在使用#each 时设置了数据上下文,因此只需使用:
<li>{{title}}</li>
在不知道你在做什么的情况下很难确定 Session 是否是在这里使用的正确类型的反应变量,但我粗略的猜测是 Mini Mongo 集合可能更适合什么看来你在做。
为了让您开始确定用于此目的的反应变量的正确类型,请转到 full Meteor documentation 并调查:集合、会话和反应变量。
编辑:退一步澄清一下,模板助手称为反应式计算。只有在它们各自的模板中使用并且在计算中使用反应变量时,助手内部的反应式计算才会执行。反应变量有多种类型,每种都有自己的属性。在您使用 Session 之前,您的代码可能根本不起作用,因为您没有使用反应变量。