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())"
      }
   ]
}

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

完全なコードはここにあります

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からのコールバックで値が変更されるヘルパーobservableを設定する必要があります。

今のところ、計算されたカントが観測可能である理由がわかりません。

// 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 に答える