Mein Beispiel funktioniert, aber ich bin verwirrt über den Speicherort der Anweisung ko.applyBindings(). Ich habe this approach verwendet, um mein ViewModel von einer einzigen getJSON-Anfrage zu füllen. Aber angenommen, ich brauche 2 getJSON-Anfragen. Ich habe das "var viewModel = new MyViewModel();" außerhalb der getJSON, aber die ko.applyBinding() war in beiden Methoden getJSON, und ich verstehe, dass Sie nicht 2 Bindungen an die gleiche VM haben sollte. Ich habe versucht, die ko.applyBinding() unter dem getJSON zu bewegen, aber nichts hat funktioniert. Also habe ich ko.applyBinding() in einer der getJSON-Methoden gelassen und VM-Methode aufgerufen, um die Variable aus dem anderen JSON-Aufruf zu setzen. Es scheint zu funktionieren, aber ich bin besorgt, wenn es ein Timing-Problem gibt, das Probleme verursachen kann, wenn die JSON-Anfragen zu unterschiedlichen Zeiten zurückkehren.Knockout.js Bindung mit mehreren getJSON-Anfragen
var MyViewModel = function() {
var self = this;
self.types = ko.observableArray();
self.states = ko.observableArray();
self.loadStates = function (states){
self.states = states;
}
}
var viewModel = new MyViewModel();
$(function() {
$.getJSON('json/typeArray.json', function(jTypes){
viewModel.types = jTypes;
ko.applyBindings(viewModel);
});
$.getJSON('json/stateArray.json', function(jStates){
viewModel.loadStates(jStates);
//ko.applyBindings(viewModel);
});
});
Ich könnte verschachtelte JSON-Anfragen verwenden, aber ich würde es vorziehen, sie zur gleichen Zeit auszuführen.
Warum kann das ko.applyBindings (viewModel) nicht an das Ende dieses Skripts verschoben werden? Ich habe es versucht, aber keines meiner Arrays wird aufgefüllt.
Update: Ja, es gibt ein Timing-Problem. Manchmal wird das zweite "states" -Array in der Benutzeroberfläche aktualisiert, und manchmal nicht. Es hängt offenbar davon ab, welcher getJSON zuerst zurückkehrt. Also muss ich eine Lösung für dieses Problem finden.
Hier ist der Versuch, die applyBindings nach Ansichtsmodell Schöpfung zu bewegen, was nicht (siehe Kommentar) funktionierte:
var MyViewModel = function() {
var self = this;
self.name = "myViewModel";
self.states = ko.observableArray();
self.types = ko.observableArray();
self.loadStates = function (states){
self.states = states;
console.log("Set states in viewModel: " + self.states);
}
}
var viewModel = new MyViewModel();
ko.applyBindings(viewModel);
$(function() {
$.getJSON('json/typeArray.json', function(jTypes){
console.log("Setting types in viewModel: " + viewModel.name);
viewModel.types = jTypes;
//ko.applyBindings(viewModel);
});
$.getJSON('json/stateArray.json', function(jStates){
console.log("Setting states in viewModel: " + viewModel.name);
viewModel.loadStates(jStates);
//ko.applyBindings(viewModel);
});
});
applyBindings sollte einmal aufgerufen werden, z. unmittelbar nach der Erstellung von viewModel. Sie sollten beobachtbare Eigenschaften in der Funktion get json done aktualisieren: viewModel.types (jTypes) - ich nehme an, dass jTypes ein Array ist. – TSV
Ich habe versucht, die applyBindings nach der Erstellung von viewModel zu setzen, aber die Arrays werden nie auf der HTML-Seite aktualisiert. Wenn ich die applyBindings im getJSON auskommentiere, funktioniert es gut. Beachten Sie, dass die Einträge in console.log angeben, dass das viewModel in allen Fällen ordnungsgemäß aktualisiert wird. –
Zusätzlich zu dem, was @TSV sagt, können Sie 'Promise.all()' verwenden, um sicherzustellen, dass alle Ihre json geladen sind, bevor Ihr Callback aufgerufen wird: siehe Beispiel https://jsfiddle.net/axLokczs/2/ – Michael