gpt4 book ai didi

javascript - 如何刷新requirejs模块?

转载 作者:行者123 更新时间:2023-12-03 08:54:18 26 4
gpt4 key购买 nike

我有两个模块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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com