为什么Meteor应用程序中没有显示任何内容?

时间:2014-02-11 06:00:43

标签: javascript json meteor spacebars meteor-helper

我在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属性,但它不起作用。

4 个答案:

答案 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');
};

创建模板时会加载数据,并将其异步存储到会话变量中。请记住,这不是被动的,但由于您的数据来自方法调用,因此很难克服。