2014-02-11 183 views
1

我在我的client.js获得了该文件为什么我的Meteor应用程序中没有显示任何内容?

Template.data.champ = Meteor.call("checkLeague", function(error, results) { 
     console.log(results.data.data); 
     return results.data.data; 
}); 

所以它显示了优良的console.log,但它实际上并没有显示在网页上。

这是车把模板

<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> 

从我的理解(这是在把手方面非常有限),但{{#each冠军}}在物体迭代我的HTML文件?但由于某种原因,页面上没有显示任何内容。

这是对象结构(显示在控制台中)。

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}遍历属性并赋予对这些值的访问权限(这是一个对象),然后尝试访问handlebars模板中该变量的name属性,但它不起作用。

回答

1

佩普的答案是正确的 - 这里是如何处理这种情况的一个选项:

Template.data.created = function() { 
    Meteor.call('checkLeague', function(error, results) { 
    Session.set('champ', results.data.data); 
    }); 
}; 

Template.data.champ = function() { 
    return Session.get('champ'); 
}; 

创建模板时的数据加载,并异步存储到一个会话变量。请记住,这不是被动的,但是这很难克服,因为你的数据来自方法调用。

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]); 
    } 
} 
+1

我该如何获得这种结构与我目前的结构?数据实际上来自返回jSON对象的API。 – Maaz

+0

刚刚更新了我的答案。我想你还需要做大卫·韦尔登所说的话。 –

1

我认为这个问题可能只是#each期待一个数组,并且你正在传递一个对象。在你的帮手中,试试return _.toArray(result.data.data);

我在流星文档中找不到任何提及,但是handlebars.js docs mentions Array。此外,我已经通过阵列和它的工作。

+0

不幸的是,不行。 – Maaz

+0

是的,我正在查看方法回调的返回,并将其与助手的返回混淆。 Peppe的回答下面指出了这一点,并使用[Meteor.call在模板助手中讨论](http://stackoverflow.com/a/15186805/728291)。 – user728291

+1

在关于Meteor.call问题的其他答案之后,确实似乎handlebars需要一个数组,所以你的答案肯定有帮助。谢谢! – Maaz

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

那么这个问题最好的解决方案是什么?当我在病房里阅读时,似乎结果会在'result'中出现,而在'error'中出错。 – Maaz

+0

@Maaz Dou!改变了我的答案,但大卫已经发布了解决方案^^' –

相关问题