【问题标题】:Jquery and getJson, only works when using alert()Jquery 和 getJson,仅在使用 alert() 时有效
【发布时间】:2013-03-14 17:47:11
【问题描述】:

我的 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"
      }
   ]
}

完整代码在here

【问题讨论】:

  • 它是异步的!!!
  • self.result 成为一个简单的可观察对象,并在回调中更改其值。

标签: jquery json knockout.js getjson


【解决方案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;); 
    });
  }
});

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

您不能从异步函数返回。你需要设置一个辅助 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.observable,你只需要使用ko.computed

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

【讨论】:

  • 我需要将其设置为计算。
  • 为什么它必须是ko.computed。它依赖于哪个可观察对象?正如我现在所看到的,它确实没有必要成为computed。只需将值设置为 computing 函数的答案,就像在我的示例中一样。
  • 如果您希望该值依赖于另一个ko.observable,则只需要ko.computed。看我上面的解释
  • 你看到我的JS-Bin了吗?我的结果取决于所有其他计算元素。
  • 对不起,还是没看到。计算取决于哪个变量?计算函数中的唯一变量是data1,由getJSON返回
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-03
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
  • 2016-09-28
  • 1970-01-01
相关资源
最近更新 更多