1

我的 jquery 有问题。它似乎表现得很奇怪。这就是正在发生的事情。我试图从 JSON 文件中获取一个方程,并用剔除可观察对象进行评估。

奇怪的是,它只在我使用任何 alert('') 消息时才有效,没有它,它就不起作用。

我用谷歌搜索了我的问题,我得到的答案是关于 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())"
      }
   ]
}

数据.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"
      }
   ]
}

完整的代码在这里

4

1 回答 1

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

============================================

您不能从异步函数返回。您需要设置一个可观察的助手,其值将在 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 ); });
于 2013-03-25T09:42:18.290 回答