【问题标题】:Meteor js | Display Json in view via helper流星js |通过帮助程序在视图中显示 Json
【发布时间】:2016-01-03 10:05:18
【问题描述】:

我正在努力解决使用 Meteor JS 的问题。

我调用了一个 api,它返回给我一个 Json 数组,它看起来像在这个 url 上返回的那个(由于大小的原因,我没有把整个数组放在这里):https://blockchain.info/address/12c6DSiU4Rq3P4ZxziKxzrL5LmMBrzjrJX?format=json&offset=0

我称之为服务器端:

if (Meteor.isServer) {
    Meteor.methods({
       getWalletPreviousTx: function() {
       var url = "https://blockchain.info/address/12c6DSiU4Rq3P4ZxziKxzrL5LmMBrzjrJX?format=json&offset=0";
       var result = Meteor.http.get(url);
       if(result.statusCode==200) {
            var tx = JSON.parse(result.content);
            return tx;
       } else {
            console.log("Response issue: ", result.statusCode);
            var errorJson = JSON.parse(result.content);
            throwError("Couldn't fetch wallet balance from Blockchain, try again later !");
        }
      }
    });
}

然后我通过特定模板中的助手将其检索到我的视图中:

Template.wallet.helpers({
    addrTxs: function () {
      Meteor.call('getWalletPreviousTx', function(err, tx) {
         console.log(tx);
         return [tx];
      });
    }
});

助手中的 console.log 实际上记录了我的 Json 数组,这意味着它可以访问它。 现在我正在努力的部分是将这个 Json 检索到我的视图中,我尝试了很多方法,但它们都不起作用,实际上我有这个:

<template name="wallet">
    <table>
            {{#each addrTxs}}
                <ul>
                    {{> addrTx}}
                </ul>
            {{/each }}
     </table>
</template>

我要显示的Json部分是每笔交易的“addr”和“value”:

"inputs":[
  {
     "sequence":4294967295,
     "prev_out":{
        "spent":true,
        "tx_index":97744124,
        "type":0,
        "addr":"1AWAsn8rhT555RmbMDXXqzrCscPJ5is5ja",
        "value":50000,
        "n":0,
        "script":"76a914683d704735fd591ba9f9aebef27c6ef00cbd857188ac"
     }
  }
]

事实是,我从未设法在我的视图中显示此 Json 数组中的任何内容,即使直接将其放在我的视图中也不会显示任何内容:

{{addrTxs}}

我做错了什么?有人可以帮忙吗?

感谢阅读。

----------- 编辑----------

我认为问题更多在于我的帮助程序和模板是在 api 调用完成之前加载的(因为 console.log 在我的页面呈现后 3 秒出现在我的控制台中)。如何让我的助手等到 api 调用完成后再在视图中呈现它?我用的是铁路由器。

我试图在我的路由上添加一个 waitOn 操作,以便等到我的 api 调用完成:

Router.route('/wallet', {
  name: 'wallet',
  template: 'wallet',
  loadingTemplate: 'loading',
  waitOn: function () {
    Meteor.call('getWalletPreviousTx', function(error, result) {
    if(!error) {
       Ready.set(result)
    }
  });
  return [
    function () { return Ready.get(); }
  ];
 },
 action: function () {
    if (this.ready())
      this.render();
    else
      this.render('loading');
 }

});

上面带有 waitOn 操作的代码似乎可以工作(我没有错误),但我不知道如何在我的视图中显示来自的特定结果:

if(!error) {
   Ready.set(result)
}

【问题讨论】:

    标签: javascript arrays json meteor


    【解决方案1】:

    交易包含在 tx.txs 中,并对其进行迭代。

    Template.wallet.helpers({
        addrTxs: function () {
          Meteor.call('getWalletPreviousTx', function(err, tx) {
             console.log(tx);
             return tx.txs;
          });
        }
    });
    

    你是对的,你需要在异步调用中使用会话变量。

    首先,在创建时调用方法:

    Template.wallet.created = function () {
      Meteor.call('getWalletPreviousTx', function(err, tx) {
         console.log(tx.txs);
         Session.set('tx', tx.txs);
      });
    };
    

    助手应该是这样的:

    Template.wallet.helpers({
      addrTxs: function () {
        return Session.get('tx');
      }
    });
    

    【讨论】:

    • 感谢您的回复。我尝试了你的方式,在我看来什么也没发生,但如果我 console.log(tx.txs) 它返回我需要的数组数组。我认为问题不在于我的视图代码,而更多在于当助手在视图中呈现时 API 调用未完成。我怎样才能等到调用完成后再加载模板?
    • 你能提供你用 {{> addrTx}} 调用的模板吗?
    • 这是我的模板 但我真的认为问题出在我的服务器端调用在我的模板加载之前没有完成。我在路线上使用 waitOn 功能更新了我的问题。
    • 我们越来越近了,我用 Session.get 完成了你的工作,现在我在我的视图中打印了一些东西: {{#each addrTxs}} {{/each}}
      {{this}}
      在我看来,这段代码显示 [object ][object ][object ]...。如果我用 {{> addrTx}} 替换 {{this}} 它什么也不打印!
    • 我不知道你为什么要使用模板 {{> addrTx }} 如果它不存在?相反,您可以显示 {{ inputs[0].prev_out.addr }} 和 {{ inputs[0].prev_out.value }}
    猜你喜欢
    • 2023-03-31
    • 1970-01-01
    • 2015-05-04
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多