Как обнаружить изменение учетной записи в MetaMask с помощью Meteor и web3? - PullRequest
0 голосов
/ 10 января 2019

Я создаю DApp с помощью метеора, в котором templateVar отображает адрес учетной записи.

Используя функцию web3 в JavaScript, я определил метод 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 голосов
/ 16 января 2019

Я думаю, вы должны поместить интервал внутри 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, вам не нужно вызывать функцию обновления. Шаблон должен обновляться автоматически, так как в нем используется значение.

Я не проверял это, но я думаю, что это должно работать так

...