【问题标题】:Getting Data from Server side HTTP.call to Client template从服务器端 HTTP.call 获取数据到客户端模板
【发布时间】:2016-03-09 13:41:32
【问题描述】:

我目前将流星用于我的一个微型项目,以获得一些使用经验。设置后不久,我遇到了一些麻烦,我从 API 调用接收到的数据到第三方站点到客户端到模板中。我检查了通常的地方以寻找答案并找到了一些信息,但似乎没有任何信息对我有用。

所以我有一个对 Steam Web Api 的简单 API 调用:

Meteor.methods({
  getPlayerStats: function() {
    return HTTP.get("http://api.steampowered.com/ISteamUserStats/GetUserStatsForGame/v0002/?appid=730&key=XXXXXXXXXXXXXXX&steamid=XXXXXXXX");
  }
});

(出于匿名目的删除了 API 密钥和 Steam id,但调用确实返回了有效响应)

所以我使用 Iron Router 进行模板渲染。

Router.route('/profile/:steamid', {
  name:'profile',
  template: 'profile',
  data: function() {
    Meteor.call('getPlayerStats', function(err, res) {
      if(err) {
        return {err: err, stat: null};
      } else {
        var redata = JSON.parse(res.content);
        var stats = redata.playerstats.stats;
        console.log({err: null, stats: stats});
        return {err: null, stats: stats};
      }
    });
  }
});

如您所见,我在 data 方法中返回了一个对象,其中包含错误或从 api 调用获得的结果的解析版本。 console.log 实际上返回客户端浏览器中预期的所有内容,即这样的对象:

{err: null, stats: [{name: "xx", value: "XY"},...]}

现在真正让我想知道的部分是模板:

<template name="profile">
  <p>{{err}}</p>
  <ul>
    {{#each stats}}
      <li>{{name}} - {{value}}</li>
    {{/each}}
  </ul>
</template>

它不能渲染任何东西,不是错误(它是空的,因此不是很重要),但也不是 stats 数组。

有人知道我在这个问题上哪里出错了吗?

【问题讨论】:

    标签: meteor iron-router


    【解决方案1】:

    您不能从异步调用返回数据。相反,您可以在模板的 created 函数中使用 ReactiveVarSession Variable 像这样

    Template.profile.created = function () {
    // or Template.profile.onCreated(function () {
        var template = this;
        template.externalData = new ReactiveVar(null);
        Meteor.call('getPlayerStats', function(err, res) {
            if(err) {
                template.externalData.set({err: err, stat: null});
            } else {
                var redata = JSON.parse(res.content);
                var stats = redata.playerstats.stats;
                console.log({err: null, stats: stats});
                template.externalData.set({err: null, stat: stats});
            }
        });
    };
    // }); //comment the above line and use this, if you used onCreated instead of created.
    

    然后在你的助手中,

    Template.profile.helpers({
        externalData: function () {
            var template = Template.instance();
            return template.externalData.get();
        }
    });
    

    然后在你的模板html中,

    <template name="profile">
        {{#if externalData}}
            {{#if externalData.err}}
                <p>There is an error. {{externalData.err}}</p>
            {{else}}
                <ul>
                    {{#each externalData.stats}}
                        <li>{{name}} - {{value}}</li>
                    {{/each}}
                </ul>
             {{/if}}
         {{/if}}
    </template>
    

    【讨论】:

    • 用 Session 和 ReactiveVar 快速测试过,都不想工作......
    • @cschaeffler 当你使用它们时发生了什么?控制台中有任何错误消息吗?或者它没有错误并且没有在模板上呈现?在你的助手和 Meteor.call 的回调中添加控制台日志,让我知道正在记录什么。
    • 好吧,模板上没有渲染任何内容。我切换到流星服务器端的同步回调,并希望它能修复它,但根本没有改变任何东西。客户端控制台按预期记录结果,服务器控制台不显示问题和预期数据,但模板上没有呈现任何内容...
    猜你喜欢
    • 1970-01-01
    • 2020-08-11
    • 2020-08-16
    • 2015-09-30
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 2012-10-17
    相关资源
    最近更新 更多