我的jquery出了问题。这看起来很奇怪。这是正在发生的事情。我试图从JSON文件中获取一个方程式并使用knockout可观察对象进行评估。
有什么奇怪的,它只有在我使用任何警报('')消息时才有效,没有它,它就不起作用。
我用谷歌搜索了我的问题,我得到的答案是关于ajax电话。但我在这里使用jQuery函数$ getJSON
代码
function loadData(fileName) {
var data = $.getJSON( fileName + ".json");
return(data);
}
var res = 0;
var Student = function(data) {
var self = this;
ko.mapping.fromJS(data, { }, self);
var res = 0;
self.result = ko.computed(function() {
loadData("Eqn").done(function(data1) {
if (data1 && data1.eqn) {
$.each(data1.eqn, function(key, value){
var str = value.Equation;
res = eval (str);
});
}
});
return(res);
});
};
如果我在return()之前添加警报,一切正常。
Eqn.json
{
"eqn":[
{
"Equation":"parseFloat(self.English()) + parseFloat(self.Japanese()) + parseFloat(self.Calculus()) + parseFloat(self.Geometry())"
}
]
}
Data.json
{
"info":[
{
"Name":"Noob Here",
"Major":"Language",
"Sex":"Male",
"English":"15",
"Japanese":"5",
"Calculus":"0",
"Geometry":"20"
},
{
"Name":"Noob Here",
"Major":"Calculus",
"Sex":"Female",
"English":"0.5",
"Japanese":"40",
"Calculus":"20",
"Geometry":"05"
}
]
}
完整代码位于here
答案 0 :(得分:1)
修改
所以主要的问题是依赖项是从JSON数据中获取的。以下解决方法被证明是解决方案:
self.eqn = ko.observable(null);
self.reslut = ko.computed(function(){ return self.eqn() && eval( self.eqn() ); });
loadData("Eqn").done(function(data1) {
if (data1 && data1.eqn) {
$.each(data1.eqn, function(key, value){
self.eqn( value.Equation;);
});
}
});
===========================================
您无法从异步函数返回。你需要设置一个helper observable,其值将在getJSON的回调中发生变化。
现在我不明白为什么你的计算不能成为一个可观察的。
// let self.result be a simple observable
self.result = ko.observable();
// now call the function to update self.result
loadData("Eqn").done(function(data1) {
if (data1 && data1.eqn) {
$.each(data1.eqn, function(key, value){
var str = value.Equation;
res = eval (str);
// set the value of self.result to the result of
// your computing function
self.result( res );
});
}
})
如果变量取决于另一个ko.computed
ko.observable
var a = ko.observable("peter"),
b = ko.computed(function(){ return "hi " + a (); });
在这种情况下,每当您更新a时,b都会更新。所以你可以把它看作以下
的简写var a = ko.observable("peter"),
b = ko.observable("hi peter");
a.subscribe(function(v){ b( "hi " + v ); });