我正在努力解决使用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)
}
答案 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');
}
});