javascript - 如何刷新requirejs模块?

标签 javascript node.js requirejs js-amd

我有两个模块 settingmap.js

var settingMap = {
    scWidth : [4000, 6000, 8000],
    scHeight : [5000, 7000, 9000],
    bxWidth : [100, 90, 80],
    bxHeight : [100, 90, 80],
    totalTime : [50, 40, 30],
    level : [1, 2, 3],
    boxColor : ['yellow', 'green', 'blue']
};

setting.js

define(['settingmap', 'gamestatus'], function (settingMap, gamestatus) {

    var setting = {
    scWidth : settingMap.scWidth[gamestatus.levelIndex],
    scHeight : settingMap.scHeight[gamestatus.levelIndex],
    bxWidth : settingMap.bxWidth[gamestatus.levelIndex],
    bxHeight : settingMap.bxHeight[gamestatus.levelIndex],
    totalTime : settingMap.totalTime[gamestatus.levelIndex],
    level : settingMap.level[gamestatus.levelIndex],
    maxLevel : settingMap.level.length,
    boxColor : settingMap.boxColor[gamestatus.levelIndex]
    };

    return setting;

});

我在其他模块中使用了设置

我将制作gamestatus.levelIndex++

但我总是得到旧的设置,而没有 gamestatus.levelIndex++

如何刷新模块设置

最佳答案

定义scWidth作为getter :

var setting = {
    get scWidth () { 
        return settingMap.scWidth[gamestatus.levelIndex]; 
    }
};

这边走gamestatus.levelIndex每次想要获取 scWidth 的值时都会进行评估.

在您当前的代码中,scWidth被设置为一个值一次,并且不会改变,除非您有其他代码直接分配给它。

理论上,您可以“刷新”RequireJS 模块,但我不提倡使用这种方法来实现您的目标。要做到正确是很复杂的。

<小时/>

您已编辑问题以在 settings 中添加一大堆其他值映射到 settingMap 中的值。很公平,我就是这样做的。定义于 settings所有遵循 settings.<name> 模式的字段-> settingMap.<name>[gamestatus.levelIndex]然后运行一个循环来为所有遵循以下模式的字段定义 getter:

// Extend this list to all the fields that follow the pattern.
var fields = ["scWidth", "scHeight"];

for (var i = 0, field; (field = fields[i]); ++i) {
    (function (field) {
        Object.defineProperty(settings, field, {
            get: function () {
                return settingMap[field][gamestatus.levelIndex];
            }
        });
    })(field);
}

这是一段完整的代码,显示它的工作原理:

var gamestatus = {
    levelIndex: 0
};

var settingMap = {
    "scWidth": [ "scWidth0", "scWidth1"],
    "scHeight": [ "scHeight0", "scHeight1"]
};

var settings = {
    // Any field that does not follow the pattern can be put here.
    maxLevel : settingMap.level.length
};

// Extend this list to all the fields that follow the pattern.
var fields = ["scWidth", "scHeight"];

for (var i = 0, field; (field = fields[i]); ++i) {
    (function (field) {
        Object.defineProperty(settings, field, {
            get: function () {
                return settingMap[field][gamestatus.levelIndex];
            }
        });
    })(field);
}

console.log(settings.scWidth);
console.log(settings.scHeight);
gamestatus.levelIndex++;
console.log(settings.scWidth);
console.log(settings.scHeight);

代码注释:

  1. setter/getter 以及如何定义它们有详细记录 here .

  2. 循环中立即调用的匿名函数是为了避免循环中的闭包问题。 (有关问题所在的完整讨论,请参阅 this question。)

  3. 循环代码:

    for (var i = 0, field; (field = fields[i]); ++i) {
    

    可能是:

    for (var i = 0; i < fields.length; ++i) {
        var field = fields[i];
    

    只要 fields ,这两种方法在功能上是等效的。不包含可计算为 false 的值(这里就是这种情况)。

关于javascript - 如何刷新requirejs模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32569283/

相关文章:

javascript - div 百分比高度不按预期工作 - 在固定 div 内

javascript - VueJS 读取 Dom 属性

javascript - 如何在完成一个功能后调用不同的功能?

node.js - 使用 ECDH 和 nodejs 加密解密 secret

javascript - 我如何使用框内的 jQuery 使具有类 fm 然后 sm 的行一个接一个地出现?

javascript - 在angularjs中动态路由url路径

javascript - Coffeescript 类方法总是返回 false

javascript - 如何正确使用domReady requireJS插件

javascript - RequireJS:如何定义构造函数?

angularjs - Angular.js 和 Require.Js