2012-10-25 5 views
5

मैं बैकबोन संग्रह और मॉडल के माध्यम से लोडिंग डेटा को संचालित करने के लिए jQuery की डिफरर्ड ऑब्जेक्ट का उपयोग करने में सक्षम होना चाहता हूं। मॉडल या संग्रह उदाहरण को शामिल करने के लिए किए गए और असफल कॉलबैक के लिए प्रदान किए गए तर्कों को संशोधित करने का कोई तरीका है? मैं निम्नलिखित की तरह कुछ envisioning हूँ:क्या मैं हल/विफल कॉलबैक के लिए दिए गए तर्कों को संशोधित करने के लिए jQuery की deferred.pipe विधि का उपयोग कर सकता हूं?

var _sync = Backbone.sync; 

Backbone.sync = function() { 
    var jqXhr = _sync.apply(this, arguments); 

    var self = this; 
    return jqXhr.pipe(function() { 
     var cbArgs = [self]; 
     cbArgs.push.apply(cbArgs, arguments); 
     return cbArgs; 
    } 
} 

... 
var c = new Backbone.Collection(); 
c.url = "/path/to/resources"; 
c.fetch().then(function(collection, data, textStatus, jqXhr) { 
    // do stuff with collection 
}); 
बेशक

, के बाद से फिल्टर एक सरणी लौटा रहा है, किया कॉलबैक बल्कि प्रगणित तर्क से, एक सरणी के साथ शुरू हो जाती है। जहां तक ​​मैं देख सकता हूं, पाइप केवल प्रदान किए गए तर्कों को संशोधित कर सकता है, न जोड़ना। किसी भी सुझाव की सराहना की जाएगी।

संपादित करें: यह एक बहुत ही सरल उदाहरण है; चूंकि मूल संग्रह पर एक बंद किया गया है, इसलिए मैं बस उस पर काम कर सकता हूं। हालांकि, उपयोग का मामला यह है कि एकाधिक बैकबोन दृश्य उसी डेटा पर भरोसा कर सकते हैं, इसलिए मैं डिफर्ड और संग्रह उदाहरण दोनों की बजाय इन विचारों पर केवल jQuery डिफरर्ड ऑब्जेक्ट की आपूर्ति करने में सक्षम होना चाहता हूं।

एक और संपादन: नीचे एक समाधान पोस्ट किया गया, लेकिन कोई अन्य सुझाव स्वागत है।

उत्तर

2

मैं मैं .pipe विधि एक नया $ .Deferred जाता है कि तुरंत संशोधित तर्कों का उपयोग का समाधान वापसी होने से ऐसा कर सकते हैं मिल गया है:

var _sync = Backbone.sync; 

Backbone.sync = function() { 
    var jqXhr = _sync.apply(this, arguments); 

    var self = this; 
    var deferred = jqXhr.pipe(function() { 
     var cbArgs = [self]; 
     cbArgs.push.apply(cbArgs, arguments); 
     var deferred = new $.Deferred(); 
     return deferred.resolve.apply(deferred, cbArgs); 
    }); 
    return $.extend(true, jqXhr, deferred); 
}; 
+0

Edite डी को नए $ के साथ मूल jqXhr का विस्तार करने के लिए। डिफर्ड, सभी AJAX- विशिष्ट तरीकों (.success, .abort, आदि) के लिए समर्थन बनाए रखना। – philm

1

बहुत अपने जवाब के लिए इसी तरह एक समाधान है, लेकिन बिना पाइप, जब से तुम वास्तव में परिणामों को फ़िल्टर करने की जरूरत नहीं है: मैं सीधे एक नई Backbone.sync से स्थगित कर लौट बजाय पाइप एक आस्थगित

Backbone.originalSync = Backbone.sync; 
Backbone.sync = function(method, model, options) { 
    var xhr = Backbone.originalSync.call(this, method, model, options); 

    var dfd = $.Deferred(); 
    xhr.done(function() { 
     var cbArgs = [model].concat(_.toArray(arguments)); 
     dfd.resolve.apply(dfd, cbArgs); 
    }); 
    xhr.fail(function() { 
     var cbArgs = [model].concat(_.toArray(arguments)); 
     dfd.reject.apply(dfd, cbArgs); 
    }); 

    return dfd; 
}; 

और एक फिडल http://jsfiddle.net/d8FqA/

संकल्प लिया की

एक सरल भिन्नता अगर आप this अपने कॉलबैक में मॉडल/संग्रह है, जो समारोह हस्ताक्षर अछूता छोड़ देता है करने के लिए बाध्य करने के लिए तैयार हैं:

Backbone.originalSync = Backbone.sync; 
Backbone.sync = function(method, model, options) { 
    var xhr = Backbone.originalSync.call(this, method, model, options); 

    var dfd = $.Deferred(); 
    xhr.done(function() { 
     dfd.resolveWith(model, arguments); 
    }); 
    xhr.fail(function() { 
     dfd.rejectWith(model, arguments); 
    }); 

    return dfd; 
}; 

var c=new Backbone.Collection(); 
c.fetch().done(function() { 
    console.log(this); 
    console.log(arguments); 
}); 

http://jsfiddle.net/d8FqA/1/

जो हमें सुराग के रूप में पारित करने के लिए मॉडल Ajax अनुरोध करने के लिए संदर्भ:

Backbone.originalSync = Backbone.sync; 
Backbone.sync = function(method, model, options) { 
    options || (options={}) ; 
    options.context = model; 
    return Backbone.originalSync.call(this, method, model, options); 
}; 

var c=new Backbone.Collection(); 
c.fetch().done(function() { 
    console.log(this); 
}); 

http://jsfiddle.net/d8FqA/2/

+0

दिलचस्प ... निश्चित रूप से एक समान समाधान। एक बात मुझे लगता है कि दोनों समाधानों से लाभ हो सकता है, जो मूल जेकएक्सएच ऑब्जेक्ट को नए डिफ्रैड के साथ विस्तारित करेगा, जैसे कि बैकबोन.sync की प्रतिक्रिया पूर्व में (वादे के अपवाद के साथ) बिल्कुल नहीं बदली है।) $ .extend (सच, एक्सएचआर, डीएफडी); – philm

+0

@philm मुझे लगता है कि हम कॉलबैक में संदर्भ का उपयोग करके चीजों को बहुत सरल बना सकते हैं और एक्सएचआर ऑब्जेक्ट अकेले छोड़ सकते हैं। समाधान के साथ मेरा उत्तर अपडेट किया गया – nikoshr

+0

यह प्रस्तुत करने वाले मुद्दों में से एक यह है कि यदि हम एकाधिक स्थगित होने का इंतजार कर रहे हैं, तो संदर्भ किस संग्रह से बंधेगा? पूर्व :) var col1 = नया Bacbkone.Collection(), col2 = नया बैकबोन। चयन(); $ .when (col1.fetch(), col2.fetch())। फिर (फ़ंक्शन() {...}); – philm

संबंधित मुद्दे

 संबंधित मुद्दे