流星js |通过助手

时间:2015-10-06 13:06:46

标签: javascript arrays json meteor

我正在努力解决使用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部分是&#34; addr&#34;和&#34;价值&#34;每笔交易:

"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)
}

1 个答案:

答案 0 :(得分: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');
  }
});