Javascript function modular approach init variable issue

49 views Asked by At

I have a modular libray javascript file where I am exposing two functions

  1. init to initalise variables from my main.html file.

  2. execValidation function to run based on those three variables collections initialised through main file.

For example:

var libraryModule = (function () {
  var arVals = {};
  var webFormData = {};
  var rules = [];

  function init(arVals, webFormData, rules) {
  //init all variables to global variables to use in execute Validations
    this.arVals = arVals;
    this.webFormData = webFormData;
    this.rules = rules;
  }

  //only passing RuleID, but it has dependencies of other variables, which I 
  //do not want to pass here
  function execValidation(ruleID) {
    //debugger;
    //Load arVals, webFormData and Rules from init
    var webFormData = this.webFormData;

    var arVals = this.arVals;
    var arVal = arVals[ruleID];

    var rules = this.rules;
    var rule = rules[ruleID]

    console.log(arVal);
    console.log(webFormData);
    console.log(rules);

  }

 return {
    execValidation: execValidation,
    init : init
 }
})(); // IIFE function

In My html file, I am calling like this

 var arVals = {};
    //calling json file using call back
    ruleConfigModule.init(function (data) {
        arVals = data;

    });

//passing the arVals, webFormData and rules collection to init
libraryModule.init(arVals, webFormData, rules);

Only passing the ruleID
var result = libraryModule.execValidation("Rule1");

I only want to pass one variable which is RuleID from execValidation function, but the init function should setup those variables inside the js library itself. Please can anyone help, as it does not work or help to re-organise it.

JSON calling method to populate arVals

var ruleConfigModule = (function () {

function init(callback) {
    loadJSON(function (json) {
        callback(json);
    });
}
// Let's hide this function

function loadJSON(callback) {
    var xobj = new XMLHttpRequest();
    xobj.overrideMimeType("application/json");
    xobj.open('GET', 'http://localhost/test/config.json', true);
    xobj.onreadystatechange = function () {
        if (xobj.readyState == 4 && xobj.status == "200") {
            callback(JSON.parse(xobj.responseText));
        }
    };
    xobj.send();
}

return {
    //loadJSON: loadJSON,
    init: init
}

})();

Updated: Blockquote How do I ensure that arVals populated before the init method gets called?

1

There are 1 answers

0
Tristan De Oliveira On

This should work

function LibraryModule() {
  var arVals = {};
  var webFormData = {};
  var rules = [];
}

LibraryModule.prototype.init = function init(arVals, webFormData, rules) {
  //init all variables to global variables to use in execute Validations
  this.arVals = arVals;
  this.webFormData = webFormData;
  this.rules = rules;
}

LibraryModule.prototype.execValidation = function execValidation(ruleID) {
  //debugger;
  //Load arVals, webFormData and Rules from init
  var webFormData = this.webFormData;

  var arVals = this.arVals;
  var arVal = arVals[ruleID];

  var rules = this.rules;
  var rule = rules[ruleID]

  console.log(arVal);
  console.log(webFormData);
  console.log(rules);

  return rules;

}


let libraryModule = new LibraryModule();

libraryModule.init({
  rule: 'TEST'
}, {
  rule: 'TEST'
}, {
  rule: 'TEST'
})
var result = libraryModule.execValidation("rule");
console.log(result);