繁体   English   中英

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

[英]How to detect an account change in MetaMask using Meteor and web3?

我正在使用流星创建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);
    });
}

事件的问题在于它需要一个事件,而metamask检测功能每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>

我认为您应该将间隔循环放在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您不必调用更新函数。 模板将随着使用的值而自动更新。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM