2013-03-25 2 views
1

У меня возникли проблемы с моим jquery. Кажется, это странно. Это то, что происходит. Я пытаюсь получить уравнение из файла JSON и оценивать с помощью нокаутных наблюдаемых объектов.JQuery и getJson работает только при использовании 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);  
    }); 
    }; 

Все работает отлично, если я добавить сигнал перед возвращением().

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

+0

пусть 'self.result' быть простым наблюдаемым, и изменить его значение в функции обратного вызова. – lordvlad

ответ

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

в этом случае, когда вы обновляете а, б будет обновляться. так что вы можете увидеть его в виде короткой стороны для следующего

var a = ko.observable("peter"), 
    b = ko.observable("hi peter"); 
a.subscribe(function(v){ b("hi " + v); }); 
+0

Но когда мне это нравится. Вычисленная функция не будет работать? – Okky

+0

Мне нужно установить его как вычисленный. – Okky

+0

почему exaccty нужно, чтобы он был 'ko.putputed'. от чего это видно? как я вижу сейчас, нет необходимости в том, чтобы он был «вычислен». просто установите значение как ответ из вашей функции 'вычисление', как в моем примере. – lordvlad

Смежные вопросы