Javascript函数模块化方法init变量问题

问题描述 投票:0回答:1

我有一个模块化的库javascript文件,我在这里暴露了两个函数

  1. init从我的main.html文件初始化变量。
  2. execValidation函数基于通过主文件初始化的那三个变量集合运行。

例如:

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

在我的html文件中,我这样打电话

 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");

我只想从execValidation函数传递一个属于RuleID的变量,但init函数应该在js库本身内设置这些变量。请任何人都可以提供帮助,因为它不起作用或帮助重新组织它。

用于填充arVals的JSON调用方法

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
}

})();

更新:Blockquote如何确保在调用init方法之前填充arVals?

javascript initialization global revealing-module-pattern
1个回答
0
投票

这应该工作

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);
© www.soinside.com 2019 - 2024. All rights reserved.