1

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

根据我的理解(这在把手方面非常有限)但是 {{#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

4 回答 4

2

从有关以下文档的文档中Meteor.call

如果包含回调函数作为最后一个参数(不能作为方法的参数,因为函数不可序列化),该方法将异步运行:它不会特别返回任何内容,也不会抛出异常。

因此,无论Template.data.champ分配什么值,它都是“没有什么特别的”(请注意,您从回调中返回的内容永远不会在任何地方使用)。

您可以将其存储在 Session 中,如下所示:

Session.setDefault('theData', [])

Meteor.call("checkLeague", function(error, results) {
    Session.set('theData', results.data.data)
});

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

但我会尝试使用一个集合来代替。

于 2014-02-11T06:31:25.267 回答
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');
};

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

于 2014-02-11T06:38:57.690 回答
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]);
    }
}
于 2014-02-11T06:19:09.240 回答
1

我认为问题可能只是 #each 需要一个数组,而您正在传递一个对象。在你的助手中,尝试return _.toArray( result.data.data );.

我在流星文档中找不到任何提及,但handlebars.js 文档提到了 Array。另外,我之前已经通过了 Array 并且它可以工作。

于 2014-02-11T06:19:28.880 回答