$0.1

TypeError: Cannot read property 'votedEvent' of undefined

Ask a question+
0

I am trying to watch event to make page automatically reload as soon as the vote is casted.The current installed version of web3 is 1.2.7 and according to the documentation it is said to use on function, but I am getting error.

The Election sol file :


pragma solidity 0.5.16;  

contract Election {

    string public candidate;

   event votedEvent(uint indexed _candidateId);

  struct Candidate{
     uint id;
     string name;
     uint voteCount;
     }

   mapping(uint=> Candidate) public candidates;
   mapping(address=> bool) public voters;

   uint public candidatesCount;


    constructor () public {
        addCandidate("Candidate 1");
        addCandidate("Candidate 2");

    }

    function addCandidate (string memory _name) private{   
       candidatesCount++;
       candidates[candidatesCount] = Candidate(candidatesCount,_name,0);
}

    function vote (uint _candidateId) public{
       require(!voters[msg.sender]);
       require(_candidateId> 0 && _candidateId <= candidatesCount);
       voters[msg.sender]=true;
       candidates[_candidateId].voteCount++;
       emit votedEvent(_candidateId);
}

}

The app.js file:



App = {
  web3Provider: null,
  contracts: {},
  account: '0x0',

  init: function() {
    return App.initWeb3();
  },


  initWeb3: function() {
 if (typeof web3 !== 'undefined') {
      App.web3Provider = web3.currentProvider;
      web3 = new Web3(web3.currentProvider);
    } else {
      App.web3Provider = new Web3.providers.HttpProvider('http://localhost:7545');
      web3 = new Web3(App.web3Provider);
    } 
   return App.initContract();
  },

 initContract: function() {


    $.getJSON("Election.json", function(election) {

      App.contracts.Election = TruffleContract(election);

      App.contracts.Election.setProvider(App.web3Provider);

      App.listenForEvents();

      return App.render();
    });
  },


  render: function() {
    var electionInstance;
    var loader = $("#loader");
    var content = $("#content");

    loader.hide();
    content.hide();

    web3.eth.getCoinbase(function(err, account) {
      if (err === null) {
        App.account = account;
        $("#accountAddress").html("Your Account: " + account);
      }
    });

    App.contracts.Election.deployed().then(function(instance) {
      electionInstance = instance;
      return electionInstance.candidatesCount();
    }).then(function(candidatesCount) {
      var candidatesResults = $("#candidatesResults");
      $('#candidatesResults').empty();

      var candidatesResults1 = $("#candidatesResults1");
      $('#candidatesResults1').empty();

      var candidatesSelect = $('#candidatesSelect');
      $('#candidatesSelect').empty(); 

     for (var i = 1; i <= candidatesCount; i++) {  
        electionInstance.candidates(i).then(function(candidate) {
          var res;
          var id = candidate[0];
          var name = candidate[1];
          var voteCount = candidate[2]; 

          candidatesResults.empty();
          var candidateTemplate = "<tr><th>" + id + "</th><td>" + name + "</td><td>" + voteCount + "</td></tr>"
          candidatesResults.append(candidateTemplate);     

          var candidateOption = "<option value='" + id + "' >" + name + "</ option>"
            candidatesSelect.append(candidateOption);  

        });
       }     

             return electionInstance.voters(App.account);
    }).then(function(hasVoted) {
    if(hasVoted) {
      $('form').hide();
    }     
      loader.hide();
      content.show();
    }).catch(function(error) {
      console.warn(error);
    });  
  },


 castVote: function() {
    var candidateId = $('#candidatesSelect').val();
    App.contracts.Election.deployed().then(function(instance) {
      return instance.vote(candidateId, { from: App.account });
    }).then(function(result) {
      $("#content").hide();
      $("#loader").show();
    }).catch(function(err) {
      console.error(err);
    });
   },


 listenForEvents: function() {
  App.contracts.Election.deployed().then(function(instance) {

 instance.events.votedEvent({
    fromBlock: 0,
    toBlock: 'latest'
 }, function(error, event){ console.log(event); })
 .on('data', function(event){
    App.render();
 })
 .on('changed', function(event){

 })
 .on('error', console.error);
    });
 }
  };

$(function() {
  $(window).on('load', function () {
    App.init();
  });
});
add comment

0 Answer

Your Answer