2013-03-25 60 views
1

我遇到了我的jquery問題。這似乎很奇怪。這是怎麼回事。我試圖從JSON文件中獲得一個公式,並用敲除可觀察對象進行評估。jquery和getJson,只有在使用alert()時纔有效()

有什麼奇怪的是,它只適用於我使用任何警報('')消息,沒有它,它只是不起作用。

我GOOGLE了我的問題,我得到的答案是關於ajax調用。但是,使用這裏

代碼

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

一切jQuery函數$的getJSON IM是工作的罰款,如果我回來之前添加一個警報()。

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

+3

***這是異步!!! *** – adeneo 2013-03-25 09:32:14

+0

讓'self.result'是一個簡單的觀察到的,並在回調改變它的值。 – lordvlad 2013-03-25 09:48:38

回答

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

但是,當我這樣做。計算的函數不起作用? – Okky 2013-03-25 10:49:30

+0

我需要將它設置爲計算。 – Okky 2013-03-25 10:52:45

+0

爲什麼exaclty是否需要成爲'ko.computed'。它依賴於哪些可觀察的事物?正如我現在看到的那樣,真的不需要它是一個「計算機」。只需將值設置爲您的'computing'函數的答案,就像我的示例中那樣。 – lordvlad 2013-03-25 11:02:24

相關問題