如何使用Meteor和web3在MetaMask中检测帐户更改?

时间:2019-01-09 21:22:55

标签: javascript meteor solidity web3 metamask

我正在使用流星创建DApp,其中templateVar在其中显示帐户地址。

在JavaScript中使用web3函数,我定义了updateInterface()方法,如下所示:updateInterface()

但是,由于该方法是循环,所以我似乎无法触发Template.foo.events内部的事件。该方法可以使我alert(res)将结果提醒到屏幕上。

有人能指出我正确的方向吗?欢呼

编辑:添加了template.oncreated函数,并且函数updateInterface()放置在oncreated,helper和events方法之外。

Template.foo.onCreated(function fooOnCreated() {
    this.account= new ReactiveVar(0);
});

Template.foo.helpers({
    account() {
        var template = Template.instance();
        myContract = web3.eth.contract(ABIArray).at(contractAddress);

        var result = web3.eth.getCoinbase(function(err, res) {
            TemplateVar.set(template, "person", res);
        });
    },
}); 

Template.foo.events({
      // not sure what to place here
});

var account = web3.eth.accounts[0];
var accountInterval = setInterval(function() {
    if (web3.eth.accounts[0] !== account) {
        account = web3.eth.accounts[0];
        updateInterface();
    }
}, 100);

function updateInterface() {
    var template = Template.instance();
    var result = web3.eth.getCoinbase(function(err, res) {
        alert(res);
        TemplateVar.set(template, "account", res);
    });
}

事件的问题在于它需要一个事件,而元掩码检测功能每隔 100毫秒会检测到一个帐户更改,但我不确定updateInterface()方法的位置。

TemplateVar指向此处。

<head>
    <body>
        <div id="section">
            {{>foo}}
        </div>
    </body>
</head>

<template name="foo">
    <div id="location">
        <p>Currently logged in as: {{account}} {{TemplateVar.get 
           "account"}} </p>
    </div>
</template>

1 个答案:

答案 0 :(得分:0)

我认为您应该将间隔循环放在onCreated内,而不是检查account !== web3.eth.accounts[0],而应检查self.account.get() = web3.eth.accounts[0]

像这样

Template.foo.onCreated(function fooOnCreated() {
  this.account= new ReactiveVar(0);
  this.account.set(web3.eth.accounts[0]);
  var self = this;
  var accountInterval = setInterval(function() {
    if (web3.eth.accounts[0] !== self.account.get()) {
      self.account.set(web3.eth.accounts[0]);
    }
  }, 500);
});

,因为它是ReactiveVar,所以您不必调用更新函数。模板会随着其中使用的值而自动更新。

我还没有测试过,但是我认为它应该像这样