Jquery和getJson,仅在使用alert()时有效

时间:2013-03-25 09:31:20

标签: jquery json knockout.js getjson

我的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

1 个答案:

答案 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 ); });