Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 敲除扩展程序,使observable在第一次传递时返回其默认值,而不考虑输入_Javascript_Knockout.js_Viewmodel - Fatal编程技术网

Javascript 敲除扩展程序,使observable在第一次传递时返回其默认值,而不考虑输入

Javascript 敲除扩展程序,使observable在第一次传递时返回其默认值,而不考虑输入,javascript,knockout.js,viewmodel,Javascript,Knockout.js,Viewmodel,我已经定义了一个名为model.CustomHardicultySettings的视图模型,其一部分如下所示。它使用一个名为precision的扩展程序,它只是扩展程序示例的重命名版本,用于将Knockout.js文档中显示的小数舍入到X ko.extenders.precision=函数(目标,精度){ //创建一个可写的计算可观察对象,以拦截对我们的可观察对象的写入 var结果=ko .pureComputed({ read:target,//始终返回原始可观察值 写入:函数(newValu

我已经定义了一个名为
model.CustomHardicultySettings
的视图模型,其一部分如下所示。它使用一个名为precision的扩展程序,它只是扩展程序示例的重命名版本,用于将Knockout.js文档中显示的小数舍入到X

ko.extenders.precision=函数(目标,精度){
//创建一个可写的计算可观察对象,以拦截对我们的可观察对象的写入
var结果=ko
.pureComputed({
read:target,//始终返回原始可观察值
写入:函数(newValue){
var current=target(),
舍入乘数=数学功率(10,精度),
newValueAsNum=isNaN(newValue)?0:+newValue,
值写入=
Math.round(newValueAsNum*roundingMultiplier)/roundingMultiplier;
//只有改变了才写
如果(valueToWrite!==当前){
目标(valueToWrite);
}否则{
//如果舍入值相同,但写入了不同的值,则强制为当前字段发出通知
如果(新值!==当前值){
target.notifySubscribers(valueToWrite);
}
}
}
})
.extend({通知:“始终”});
//使用当前值初始化,以确保它已适当舍入
结果(target());
//返回新的计算可观察值
返回结果;
};
model.CustomHardicultySettings={
经济基础:高
.可观察(0)
.extend({rateLimit:{timeout:750},精度:3}),
};
在稍后的
makeGame()
函数中,我们确保我们的
model.customDifficultySettings.econBase()
observable与所选难度值的值相匹配

model.custom疑难设置.econBase(
难度信息[model.newGameDifficultyIndex()| | 0].econBase
);
log(model.customDifficultySettings.econBase());
log(困难信息[model.newGameDifficultyIndex()| | 0].econBase);
第一次运行时,
difficultyInfo[model.newGameDifficultyIndex()].econBase
的值为0.55。我希望控制台要么显示为0.55,要么如果出现问题,则显示为0。然而,对于可观察的对象,返回的是0,但是对于输入到其中的值,返回的是0.55

如果我在代码运行后从控制台查询observable,它将返回预期值0.55

如果更改了难度级别,导致再次运行
makeGame()
,则所有值都设置正确。只有在第一次运行时才会出现此问题

我已经追踪到了precision extender的问题。卸下扩展器,一切正常。但是,由于我只是复制了示例代码,我并不完全清楚它的作用以及为什么会出现这个问题


作为一种解决方法,我可以将所有可观察的默认值设置为与默认困难级别的值相匹配,但我更愿意避免这种情况。

问题似乎发生了,因为我首先声明了
费率限制。如果我逆转这一点并首先声明
精度
,那么一切都会按预期进行。因此,我的viewmodel现在看起来如下所示:

model.custom疑难设置={
经济基础:高
.可观察(0)
.extend({精度:3,速率限制:{超时:750}}),
};