Ich bin neu bei backbone.js und habe Probleme, meinen Kopf um ein Problem zu wickeln, das ich beim Entwerfen eines "Wizard" -Typ-Prozesses (ein mehrstufiges Formular) erstellt habe. Dieser Assistent sollte in der Lage sein, unterschiedliche Bildschirmverzweigungslogik abhängig von der Antwort des Benutzers auf Fragen zu behandeln, die Antworten auf jedem Bildschirm während des Benutzerfortschritts zu speichern und am Ende in der Lage sein, alle Formularantworten (jeden Schritt) in ein großes Objekt zu serialisieren (wahrscheinlich JSON). Die Fragen des Assistenten werden sich von Jahr zu Jahr ändern, und ich muss in der Lage sein, mehrere ähnliche Assistenten gleichzeitig zu unterstützen.Einen Wizard-Prozess in backbone.js erstellen
Ich habe die Grundlagen so weit wie die Erstellung der Bildschirme (mit Backbone-Formen), aber ich bin jetzt an dem Punkt, wo ich Benutzereingaben speichern möchte und ich kann nicht den besten Weg zu denken TU es. Die meisten der Beispiele, die ich gesehen habe, haben einen bestimmten Objekttyp (zB Todo
) und Sie erstellen einfach eine Sammlung von ihnen (zB TodoList
), aber ich habe eine gemischte Tasche von Backbone.Model-Definitionen wegen der unterschiedlichen Bildschirmtypen es scheint nicht ganz so einfach zu sein. Irgendwelche Hinweise darauf, wie ich meinen Assistenten und seine enthaltenen Bildschirme instanziieren und Benutzerreaktionen aufzeichnen sollte?
Wenn es hilft, kann ich eine jsfiddle mit meiner Ansicht Code, der bisher nur vorwärts und rückwärts Bildschirme (keine Benutzereingabe Antwort Aufzeichnung oder Bildschirm Verzweigung) geht.
var Wizard = Backbone.Model.extend({
initialize: function(options) {
this.set({
pathTaken: [0]
});
},
currentScreenID: function() {
return _(this.get('pathTaken')).last();
},
currentScreen: function() {
return this.screens[this.currentScreenID()];
},
isFirstScreen: function(screen) {
return (_(this.screens).first() == this.currentScreen());
},
// This function should be overridden by wizards that have
// multiple possible "finish" screens (depending on path taken)
isLastScreen: function(screen) {
return (_(this.screens).last() == this.currentScreen());
},
// This function should be overridden by non-trivial wizards
// for complex path handling logic
nextScreen: function() {
// return immediately if on final screen
if (this.isLastScreen(this.currentScreen())) return;
// otherwise return the next screen in the list
this.get('pathTaken').push(this.currentScreenID() + 1);
return this.currentScreen();
},
prevScreen: function() {
// return immediately if on first screen
if (this.isFirstScreen(this.currentScreen())) return;
// otherwise return the previous screen in the list
prevScreenID = _(_(this.get('pathTaken')).pop()).last();
return this.screens[prevScreenID];
}
});
var ChocolateWizard = Wizard.extend({
nextScreen: function() {
//TODO: Implement this (calls super for now)
// Should go from screen 0 to 1 OR 2, depending on user response
return Wizard.prototype.nextScreen.call(this);
},
screens: [
// 0
Backbone.Model.extend({
title : "Chocolate quiz",
schema: {
name: 'Text',
likesChocolate: {
title: 'Do you like chocolate?',
type: 'Radio',
options: ['Yes', 'No']
}
}
}),
// 1
Backbone.Model.extend({
title : "I'm glad you like chocolate!",
schema: {
chocolateTypePreference: {
title: 'Which type do you prefer?',
type: 'Radio',
options: [ 'Milk chocolate', 'Dark chocolate' ]
}
}
}),
//2
Backbone.Model.extend({
title : "So you don't like chocolate.",
schema: {
otherSweet: {
title: 'What type of sweet do you prefer then?',
type: 'Text'
}
}
})
]
});
wizard = new ChocolateWizard();
// I'd like to do something like wizard.screens.fetch here to get
// any saved responses, but wizard.screens is an array of model
// *definitions*, and I need to be working with *instances* in
// order to fetch
Edit: Wie gewünscht, würde Ich mag einen JSON Rückgabewert für einen Assistenten, um zu sehen, die ungefähr so aussehen (als Endziel) gespeichert wurden:
wizardResponse = {
userID: 1,
wizardType: "Chocolate",
screenResponses: [
{ likesChocolate: "No"},
{},
{ otherSweet: "Vanilla ice cream" }
]
}
Hallo. Kannst du erklären, was du holen willst?Wie sieht die Antwort aus? Vielleicht kannst du ein Beispiel geben? Btw, sehr nette Frage. – theotheo
Hallo, der Abruf wäre zum Abrufen der zuvor gespeicherten Antworten des Benutzers auf die Fragen des Assistenten (was bedeutet, dass ich auch eine Speichermethode für das Modell arbeiten müsste). Ich würde Ihnen gerne ein Beispiel geben, wie die Antwort aussehen würde, aber ich kann einfach nicht darüber nachdenken, wie ich diese App so strukturieren könnte, dass ich Ihnen das gebe. Ich brauche ein größeres Gehirn! –
@ user1248256 OK, dank Ihrer Frage habe ich ein bisschen mehr darüber nachgedacht und die Frage bearbeitet, um einzuschließen, was ich schließlich möchte, dass eine gespeicherte Zaubererabfrage in JSON (ungefähr) zurückkommt. Vielleicht muss ich ein neues Modell erstellen oder einige der Backbone-Methoden zur Synchronisierung oder Analyse patchen? –