我在client.js文件中有这个
Template.data.champ = Meteor.call("checkLeague", function(error, results) {
console.log(results.data.data);
return results.data.data;
});
所以它在console.log中显示正常,但实际上并没有显示在网页上。
这是我的带有把手模板的html文件
<body>
{{> hello}}
{{> data}}
</body>
<template name="hello">
<h1>Hello World!</h1>
{{greeting}}
<input type="button" value="Click" />
</template>
<template name="data">
{{#each champ}}
{{name}}
{{/each}}
</template>
根据我的理解(在Handlebars方面非常有限)但{{#each champ}}迭代对象?但由于某种原因,页面上没有显示任何内容。
这是对象结构(显示在控制台中)。
Object {Aatrox: Object, Ahri: Object, Akali: Object, Alistar: Object, Amumu: Object…}
Aatrox: Object
id: "Aatrox"
image: Object
key: "266"
name: "Aatrox"
title: "the Darkin Blade"
__proto__: Object
Ahri: Object
Akali: Object
Alistar: Object
Amumu: Object
Anivia: Object
Annie: Object
Ashe: Object
所以基本上我传递的对象具有包含对象值的属性。我假设{{#each}遍历属性并允许访问值(这是一个对象),然后我尝试在name
模板中访问该变量的handlebars
属性,但它不起作用。
答案 0 :(得分:2)
有关Meteor.call
的文档:
如果包含回调函数作为最后一个参数(不能 是方法的参数,因为函数不可序列化), 该方法将异步运行:它将不返回任何内容 特别是不会抛出异常。
所以无论赋值Template.data.champ
是什么,它都“没有特别”(请注意,你从回调中返回的内容永远不会在任何地方使用)。
你可以将它存储在这样的会话中:
Session.setDefault('theData', [])
Meteor.call("checkLeague", function(error, results) {
Session.set('theData', results.data.data)
});
Template.data.champ = function(){
return Session.get('theData')
}
但我会尝试使用收藏品。
答案 1 :(得分:1)
除了使用会话变量所说的内容之外。我认为您还需要将列表转换为仅包含对象的列表,而不是您配对的键值列表。
所以你想要使你的数据像这样
var champ = [{ id: "Aatrox",
image: Object,
key: "266",
name: "Aatrox",
title: "the Darkin Blade"},
{ id: "Ahri",
image: Object,
key: "267",
name: "Ahri",
title: "Hitchhikers Guide"}, ... ];
return champ;
要从当前结构中获取此结构,您需要执行类似
的操作var champ = [];
for (var a in results.data.data) {
for (var key in results.data.data[a]) {
champ.push(results.data.data[a][key]);
}
}
答案 2 :(得分:1)
我认为问题可能只是#each期待一个数组而你正在传递一个对象。在您的助手中,尝试return _.toArray( result.data.data );
。
我在流星文档中找不到任何提及但是handlebars.js docs mentions Array。此外,我之前已经通过了Array并且它可以工作。
答案 3 :(得分:1)
Peppe的回答是正确的 - 这是一个如何处理这种情况的选项:
Template.data.created = function() {
Meteor.call('checkLeague', function(error, results) {
Session.set('champ', results.data.data);
});
};
Template.data.champ = function() {
return Session.get('champ');
};
创建模板时会加载数据,并将其异步存储到会话变量中。请记住,这不是被动的,但由于您的数据来自方法调用,因此很难克服。