मैं एक मॉडल पर सफलता कॉलबैक को कैसे ट्रिगर करूं। () (?


106
this.model.save({
  success: function(model, response){
    console.log('success');
  },
  error: function(){
    console.log('error');
  }
})

मॉडल को सर्वर पर सही ढंग से पोस्ट किया गया है जो सेव को हैंडल करता है, लेकिन सफलता कॉलबैक को निकाल नहीं दिया गया है। क्या मुझे सर्वर से कुछ वापस भेजने की आवश्यकता है?


7
मुझे पता है कि मैं गलत कर रहा था: सही वाक्यविन्यास होना चाहिए: this.model.save (newItem, {सफलता: ..., त्रुटि: ...})
रनिंग कछुआ

8
'नल' एक प्लेसहोल्डर के रूप में भी ठीक काम करता है।
UpTheCreek

@UpTheCreek धन्यवाद इससे मदद मिली। मैंने स्रोत को देखा और कुंजी और मूल्य के रूप में एक खाली स्ट्रिंग पारित किया। हालांकि आपका तरीका बेहतर है।
प्रमोद

@UpTheCreek null ने किसी कारण से मेरे लिए काम नहीं किया, लेकिन एक खाली
अटारी

जवाबों:


123

सहेजें का पहला तर्क मॉडल पर सहेजने की विशेषता है:

this.model.save( {att1 : "value"}, {success :handler1, error: handler2});

9
मैं एक उलझन में हूँ - (1) मुझे लगा कि बैकबोन ने हमेशा पूरे मॉडल को सहेजने के दौरान वापस भेज दिया (यह आंशिक मॉडल अपडेट भेजने के लिए संभव नहीं है)। तो विशेषता नाम-मूल्यों का उद्देश्य क्या है? (२) यदि आप केवल कुछ .set () s करने के बाद मॉडल को बचाना चाहते हैं - तो विशेषता सूची क्यों? (3) डॉक्स में, विशेषता सूची परम को वैकल्पिक के रूप में दिखाया गया है। क्या आप स्पष्ट कर सकते हो? धन्यवाद।
UpTheCreek

7
आप अपनी विशेषताओं के साथ "सेट" का एक गुच्छा कर सकते हैं और फिर बिना किसी विशेषता के एक बचत कर सकते हैं। मॉडल की सभी विशेषताओं को हमेशा सर्वर पर भेजा जाता है। विशेषताओं के साथ सहेजें बस सेट + सेव करने का एक शॉर्टकट है।
जुलिएन

5
जैसा कि मूर्खतापूर्ण लगता है कि यह वही है जो यह करता है, शर्म की बात है कि यह खराब दस्तावेज है।
केविन

51
यह मेरे परीक्षण में प्रतीत होता है कि सफलता और त्रुटि कॉलबैक को निकाल नहीं दिया जाता है यदि आप "विशेषताओं" पैरामीटर के लिए कुछ पास नहीं करते हैं। यह दस्तावेज़ीकरण के विपरीत लगता है ... model.save ([विशेषताएँ], [विकल्प]) यह दर्शाता है कि विशेषताएँ वैकल्पिक हैं। जब मैं विशेषताओं के लिए विशेषताएँ या अशक्तता शामिल करता हूं, तो मेरी सफलता और त्रुटि कॉलबैक निकाल दिए जाते हैं। जब मैं विशेषताओं के लिए कुछ भी शामिल नहीं करता हूं, तो कॉलबैक को निकाल नहीं दिया जाता है।
केविन

6
backbone.js [ backbonejs.org/docs/backbone.html ] के स्रोत कोड की जाँच की । ऐसा लगता है कि attr अनिवार्य है .. यदि केवल 'विकल्प' प्रदान किया जाता है, तो फ़ंक्शन इसे 'attr' मानता है और कॉल को गड़बड़ कर देता है
कुमारसन

58

किसी अज्ञात कारण से, उपरोक्त किसी भी विधि ने मेरे लिए काम नहीं किया। एपीआई केवल मेरे मामले में नहीं मारा गया था।

लेकिन बाद में इस पर खोज करते हुए, मैं इस कड़ी में टकरा गया , जहां कुछ लोगों ने पहले पैरामीटर के nullबजाय कोशिश की थी {}

this.model.save(null, {
    success: function (model, response) {
        console.log("success");
    },
    error: function (model, response) {
        console.log("error");
    }
});

तो, यह मेरे लिए काम किया। आशा है कि इससे आपको भी मदद मिलेगी।


3
यह सही जवाब है। यदि आप अशक्त बैकबोन में पास होते हैं तो सेविंग के लिए सभी विशेषताओं को सर्वर पर भेज देंगे।
पॉल ऑलिवर

अजीब विचित्र लेकिन मेरी चुनी हुई विधि।
मैट फ्लेचर

37

आपके सर्वर को एक JSON ऑब्जेक्ट वापस करना होगा। यदि प्रतिक्रिया JSON ऑब्जेक्ट नहीं है, तो कॉलबैक फायर नहीं करेगा।

यदि सफलता के लिए आपका सर्वर JSON ऑब्जेक्ट नहीं लौटाता है, तो डेटा टाइप के साथ सेव करें: "टेक्स्ट" विकल्प, इस तरह:

this.model.save([],{
 dataType:"text",
 success:function() {},
 error:function() {}
});

इस विकल्प के साथ यह प्रतिक्रिया में JSON का इंतजार नहीं करेगा, लेकिन एक पाठ, और इस प्रकार कॉलबैक लॉन्च किया जाएगा।


पवित्र बकवास धन्यवाद। यह मुझे बोनर्स चला रहा था। भयानक होगा अगर यह बैकबोन डॉक्स में कहीं दस्तावेज किया गया था,
तोबियस जे

इससे मेरी गांड बच गई। मैं एक्सप्रेस 4 के साथ Res.json ({सफलता: परिणाम}) का उपयोग कर रहा था, और वह अभी भी मुझे समस्याएं दे रहा था। शायद मुझे करने की ज़रूरत है: res.json (("" सफलता ":" परिणाम "}) या कुछ और ...
अलेक्जेंडर मिल्स

आपका बहुत बहुत धन्यवाद! इससे आज मेरा काम बन गया।
एल्केफोह

11

आप अंडरस्कोर लिब का उपयोग कर सकते हैं, क्योंकि बैकबोन पहले से ही इस पर निर्भर करता है। याद रखें कि सहेजने के पहले तर्क में या तो विशेषताएँ होनी चाहिए या आप केवल {} पास कर सकते हैं यदि आप स्वयं मॉडल को बचाना चाहते हैं।

this.model.save({}, _.bind(function(model, response){
  //Do whatever you want e.g.
  this.collection.add(model)
}, this))

8

इसलिए im थोड़ा उलझन में है - क्या मुझे अभी भी सभी विशेषताओं को पास करने की आवश्यकता है ताकि मुझे एक घटना बचाने के लिए कॉल किया जा सके? क्या होगा अगर मेरा मॉडल बड़ा है .. मैं हर संपत्ति को मैन्युअल रूप से सेट करना नहीं चाहता

im कॉलिंग model.save और निम्नलिखित करने का प्रयास:

this.model.save(
    {
        success: function (model, response) {
            console.log('model saved');
        }
    });

ठीक है बस अपने ही सवाल का जवाब देने के लिए कोई भी इस पद को पाता है, मैंने निम्नलिखित काम किया:

this.model.save({ id: this.model.get('id') },
    {
        success: function (model, response) {
            console.log("success");
        },
        error: function (model, response) {
            console.log("error");
        }
    });

संपादित करें: मैं किसी कारण के लिए आप का जवाब नहीं दे सकता, लेकिन मैं संपादित कर सकता हूं

लेकिन आपको आईडी सेट करने की आवश्यकता नहीं है: this.model.get('id')आप सिर्फ एक खाली ऑब्जेक्ट पास कर सकते हैं क्योंकि एक खाली विशेषता सिर्फ विशेषताओं का विस्तार नहीं करेगी, कुछ भी नहीं:

this.model.save({}, {
    success: function (model, response) {
        console.log("success");
    },
    error: function (model, response) {
        console.log("error");
    }
});

4

निम्नलिखित कोड है जो मैं बैकबोन मॉडल सेव के लिए उपयोग कर रहा हूं।

this.model.save(model,{
   success:function(model){
       console.log("Saved Successfully");
   },
   error:function(model){
       console.log("Error");
   }
});

चियर्स

रॉय एमजे


यह कुछ हद तक एक लोकल को पास करने के लिए विचलित करने modelवाला है this.model.. modelहोना चाहिए attributes, जो सब कुछ के साथ-साथ सेट और सेव हो गया हैthis.model
फंककोडैट

@Funkodebat: हाँ। :) .. मैंने वास्तव में सोचा था कि यह सामान्य jquery-ajax के समान था, लेकिन बैकबोन में, पहला पैरामीटर मॉडल होगा। जरूरी नहीं कि इसे पास किया जाए, बल्कि इसके अनुरूप हो। यह वास्तव में काफी परेशान कर रहा है ..:
रॉय एमजे

खैर, सच्चाई यह है कि नहीं, आप कॉल सेव करते समय मॉडल पास नहीं करते हैं। सेव का पहला तर्क अतिरिक्त विशेषताएँ हैं जिन्हें आप सेव करने से पहले सेट कर सकते हैं। यह कॉलिंग की तरह होगा model.set(model.toJSON()); model.save()। एक मॉडल को सेट करने का कोई कारण नहीं है कि मॉडल को क्या सेट किया गया है .. बचत करते समय मॉडल को अपने आप से पारित करना निरर्थक है।
फंककोडायट

2
@Funkodebat मैंने इस 3 साल पुराने उत्तर में आपके परिवर्तनों को अस्वीकार कर दिया है क्योंकि उन्होंने लेखक की प्रतिक्रिया को मौलिक रूप से बदल दिया है। यह एडिट / मॉडरेशन सिस्टम का आशय नहीं है। यदि उत्तर अब प्रासंगिक या उपयुक्त नहीं है, तो इसे नीचे लिखें और एक नया लिखें। मॉडरेशन टूल व्याकरण, स्वरूपण, वर्तनी और कैपिटलाइज़ेशन को ठीक करने के लिए हैं - अन्य उपयोगकर्ताओं के उत्तरों को समायोजित करने के लिए नहीं।
पहुंच 4

2
समुदाय आपसे असहमत होगा। यह एक अत्यधिक मतदान शीर्ष जवाब के साथ एक अत्यधिक मतदान प्रश्न है। प्रश्न समुदाय के लिए प्रासंगिक लगता है। यदि आप किसी चीज से असहमत हैं तो वोट-डाउन बटन का उपयोग करें। इसकी जगह यह तय करने के लिए नहीं है कि इस साइट पर किन सवालों और जवाबों का अधिकार है, और निश्चित रूप से आपके स्थान को अन्य उपयोगकर्ताओं के उत्तरों को संशोधित करने के लिए नहीं है कि उनका अर्थ काफी बदल गया है।
पहुंच 4

1

उन लोगों के लिए जो विशेषताओं को अपडेट किए बिना एक मॉडल को सहेजना चाहते हैं, आप निम्न कार्य कर सकते हैं:

model.once("sync", function(model, response, options){
    //
});
model.once("error", function(model, response, options){
    //
});
model.save();

1

आप फ़ंक्शन को प्रारंभ करते हैं, सिंक विधि को आपके द्वारा परिभाषित पद्धति पर बाँधते हैं (onSaveSuccess)

            initialize: function (options) {
                    this.model.on('sync', _.bind(this.onSaveSuccess, this));
},
            onSaveSuccess: function() {
                console.log('saved');
                this.render();
            },

इस तरह, जब भी आप इस .odel.save () को चलाते हैं, यह onSaveSuccess फ़ंक्शन को कॉलबैक के रूप में चलाएगा यदि आपका सिंक सफल है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.