我有两个模块
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);
代码注释:
setter/getter 以及如何定义它们有详细记录 here .
循环中立即调用的匿名函数是为了避免循环中的闭包问题。 (有关问题所在的完整讨论,请参阅 this question。)
循环代码:
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/