Soy nuevo en backbone.js y tengo problemas para resolver un problema. Estoy diseñando un proceso de tipo "asistente" (por ejemplo, un formulario de pasos múltiples). Este asistente debería poder manejar diferentes lógica de bifurcación de pantalla dependiendo de la respuesta del usuario a las preguntas, almacenar las respuestas en cada pantalla a medida que el usuario progresa y, al final, ser capaz de serializar todas las respuestas del formulario (cada paso) en un objeto grande (probablemente JSON). Las preguntas del asistente cambiarán de año en año, y debo ser capaz de admitir múltiples asistentes similares que existen al mismo tiempo.Crear un proceso de asistente en backbone.js
Tengo lo básico en cuanto a la creación de pantallas (utilizando formas de red troncal), pero ahora estoy al punto en el que quiero guardar la entrada del usuario y no puedo pensar en la mejor manera de hazlo. La mayoría de los ejemplos que he visto tienen un tipo específico de objeto (por ejemplo, Todo
) y usted acaba de crear una colección de ellos (por ejemplo, TodoList
), pero tengo una mezcla de definiciones Backbone.Model debido a los diferentes tipos de pantalla, por lo no parece tan simple. ¿Alguna sugerencia sobre cómo debería crear una instancia de mi asistente y sus pantallas, y registrar las respuestas de los usuarios?
Si me ayuda puedo publicar un jsfiddle con mi código de vista que hasta ahora solo va hacia adelante y hacia atrás (no hay registro de respuesta de entrada del usuario o bifurcación de pantalla).
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
Editar: Conforme a lo solicitado, me gustaría ver un valor de retorno JSON para un mago que se ha guardado a ser algo como esto (como un objetivo final):
wizardResponse = {
userID: 1,
wizardType: "Chocolate",
screenResponses: [
{ likesChocolate: "No"},
{},
{ otherSweet: "Vanilla ice cream" }
]
}
Hola. ¿Puedes explicar lo que quieres buscar?¿Cómo se ve la respuesta? Tal vez puedas dar un ejemplo? Por cierto, muy buena pregunta. – theotheo
Hola, la búsqueda sería para recuperar las respuestas previamente guardadas del usuario a las preguntas del asistente (lo que significa que también tendría que haber un método de guardar para el modelo). Me encantaría darte un ejemplo de cómo sería la respuesta, pero parece que no puedo pensar en cómo estructurar esta aplicación lo suficiente como para darte eso. ¡Necesito un cerebro más grande! –
@ user1248256 OK, gracias a su pregunta, he pensado un poco más sobre esto y he editado la pregunta para incluir lo que finalmente me gustaría que una consulta guardada del asistente devuelva en JSON (aproximadamente). Tal vez tendré que crear un nuevo modelo o parchar algunos de los métodos de sincronización o análisis sintáctico de Backbone. –