J'ai un modèle de vue qui récupère JSON via AJAX et crée une nouvelle tâche, mais Knockout continue de me donner une erreur de liaison.Knockout.js: Impossible d'analyser les liaisons à partir de JSON
Si je code directement les données provenant du serveur directement dans mon modèle de vue, je ne reçois aucune erreur.
Mon modèle de vue crée une nouvelle tâche, qui a un identifiant, une question et un certain nombre de variantes, ce qui en soi a un texte et un drapeau booléen correct.
Le code suivant fonctionne parfaitement bien:
function Task(data) {
var self = this;
self.id = data.id;
self.question = ko.observable(data.question);
var alts = new Array();
$(data.alternatives).each(function(index){
alts.push(new Alternative(data.alternatives[index].alternative, data.alternatives[index].correct));
});
self.alternatives = ko.observableArray(alts);
}
function Alternative(alternativeText, correctAnswer) {
var self = this;
self.alternative = ko.observable(alternativeText);
self.correct = ko.observable(correctAnswer);
}
function TaskViewModel() {
var self = this;
var data = {
id: 5,
question: 'test',
alternatives: [{
alternative: 'alt 1',
correct: false
},{
alternative: 'alt 2',
correct: true
},{
alternative: 'alt 3',
correct: false
}]
};
self.task = new Task(data);
}
Mais si j'exhcange la variable data
codée en dur avec des données réelles du serveur:
function TaskViewModel() {
var self = this;
$.getJSON('/data', function(data){
self.task = new Task(data);
});
}
knock-out me donne cette erreur:
Error: Unable to parse bindings.
Message: ReferenceError: Can't find variable: task;
Bindings value: value: task.question
Les données de l'URL ressemblent à ceci:
{"id":5,"question":"test","alternatives":[{"alternative":"alt 1","correct":false},{"alternative":"alt 2","correct":true},{"alternative":"alt 3","correct":false}]}
Je ne peux pas sembler comprendre pourquoi cela ne fonctionnera pas:/
Merci l'homme. En fait, j'ai compris cela après les choses que vous avez mentionnées avec une méthode d'initialisation (que vous avez présentée ici). Cela a fonctionné comme il se doit :) –