मैं backbone.js के लिए नया हूं और किसी समस्या के चारों ओर अपने सिर को लपेटने में कुछ परेशानी हो रही है, जिसमें मैं एक "जादूगर" प्रकार की प्रक्रिया (ए.के.ए. एक बहु-चरण फ़ॉर्म) तैयार कर रहा हूं। यह विज़ार्ड प्रश्नों के उपयोगकर्ता की प्रतिक्रिया के आधार पर विभिन्न स्क्रीन ब्रांचिंग तर्क को संभालने में सक्षम होना चाहिए, प्रत्येक स्क्रीन पर प्रतिक्रियाओं को उपयोगकर्ता की प्रगति के रूप में संग्रहीत करें, और अंत में सभी फॉर्म प्रतिक्रियाओं (प्रत्येक चरण) को एक बड़ी वस्तु में क्रमबद्ध करने में सक्षम होना चाहिए (शायद जेएसओएन)। विज़ार्ड प्रश्न साल-दर-साल बदल रहे होंगे, और मुझे एक ही समय में अस्तित्व में कई समान जादूगरों का समर्थन करने में सक्षम होना चाहिए।backbone.js में एक विज़ार्ड प्रक्रिया बनाना
मुझे स्क्रीन बनाने के लिए मूल बातें मिल गई हैं (रीढ़ की हड्डी-रूपों का उपयोग करके), लेकिन अब मैं उस बिंदु पर हूं जहां मैं उपयोगकर्ता इनपुट को सहेजना चाहता हूं और मैं सबसे अच्छा तरीका नहीं सोच सकता कर दो। मैंने देखा है कि अधिकांश उदाहरणों में एक विशिष्ट प्रकार का ऑब्जेक्ट है (उदाहरण के लिए Todo
) और आप बस उनका संग्रह बनाते हैं (उदाहरण के लिए TodoList
), लेकिन मुझे बैकबोन का मिश्रित बैग मिला है। विभिन्न स्क्रीन प्रकारों के कारण मॉडल परिभाषाएं यह काफी आसान प्रतीत नहीं होता है। किसी भी संकेतक कि मुझे अपने जादूगर और इसकी निहित स्क्रीन को तुरंत चालू करना चाहिए, और उपयोगकर्ता प्रतिक्रियाओं को रिकॉर्ड करना चाहिए?
अगर यह मेरी दृश्य कोड के साथ एक jsfiddle पोस्ट करने में मदद करता है जो अभी तक केवल आगे और पीछे की ओर स्क्रीन (कोई उपयोगकर्ता इनपुट प्रतिक्रिया रिकॉर्डिंग या स्क्रीन ब्रांचिंग) नहीं जाता है।
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
संपादित करें:
wizardResponse = {
userID: 1,
wizardType: "Chocolate",
screenResponses: [
{ likesChocolate: "No"},
{},
{ otherSweet: "Vanilla ice cream" }
]
}
हैलो। क्या आप समझा सकते हैं कि आप क्या हासिल करना चाहते हैं?प्रतिक्रिया कैसी दिखती है? शायद आप एक उदाहरण दे सकते हैं? बीटीडब्ल्यू, बहुत अच्छा सवाल है। – theotheo
हाय वहाँ, प्राप्तकर्ता उपयोगकर्ता के पूर्व-सहेजे गए प्रतिक्रियाओं को विज़ार्ड प्रश्नों को पुनर्प्राप्त करने के लिए होगा (जिसका अर्थ है कि मुझे मॉडल के लिए एक सहेजने की विधि भी होनी चाहिए)। मैं आपको एक उदाहरण देना चाहूंगा कि प्रतिक्रिया कैसी दिखाई देगी, लेकिन मुझे लगता है कि इस ऐप को आपको यह देने के लिए पर्याप्त रूप से कैसे संरचना करना है, इस बारे में सोचना नहीं लगता। मुझे एक बड़ा मस्तिष्क चाहिए! –
@ user1248256 ठीक है, आपके प्रश्न के लिए धन्यवाद मैंने इस बारे में कुछ और सोचा है और जेएसओएन (लगभग) में लौटने के लिए अंत में एक सहेजी गई विज़ार्ड क्वेरी को शामिल करने के लिए प्रश्न संपादित किया है। शायद मुझे बैकबोन की सिंक या पार्स विधियों में से कुछ नया मॉडल बनाना होगा या पैच करना होगा? –