2011-05-30 8 views
41

कैश्ड मैं उपयोग कर रहा हूँ निम्नलिखित backbone.js नियंत्रक के सूचकांक कार्रवाई में लाने:backbone.js लाने परिणाम

App.Controllers.PlanMembers = Backbone.Controller.extend({ 
    routes: { 
     "": "index" 
    }, 

    index: function() { 
     var planMembers = new App.Collections.PlanMembers(); 

     planMembers.fetch({ 
      success: function() { 
       var recoveryTeam = planMembers.select(function (planMember) { 
        return planMember.get("TeamMemberRole") == "RecoveryTeam"; 
       }); 

       var otherMembers = planMembers.select(function (planMember) { 
        return planMember.get("TeamMemberRole") == "Other"; 
       }); 

       new App.Views.Index({ collection: { name: "Team", members: recoveryTeam }, el: $('#recoveryTeam') }); 

       new App.Views.Index({ collection: { name: "Team", members: otherMembers }, el: $('#otherTeam') }); 
      }, 
      error: function() { 
       alert('failure'); 
       showErrorMessage("Error loading planMembers."); 
      } 
     }); 
    } 
}); 

समस्या यह है कि परिणाम कैश्ड जा रहा है। यह डेटाबेस परिवर्तन नहीं उठाता है। क्या backbone.js को परिणामों को कैश नहीं करने के लिए वैसे भी है?

मुझे पता है कि मैं संग्रह के यूआरएल को ओवरराइड कर सकता हूं और टाइमस्टैंप जोड़ सकता हूं लेकिन मैं उससे थोड़ा क्लीनर ढूंढ रहा हूं।

+0

वही समस्या यहां। –

+2

आप जो पूछ रहे हैं उसकी पुष्टि करने की कोशिश कर रहे हैं।आप एक ऐसा कार्य करते हैं जो कॉल करने के लिए ब्राउज़र का उपयोग करने वाले कवर के तहत AJAX कॉल करता है। और ब्राउज़र कॉल नहीं कर रहा है क्योंकि यह कैश निर्देशों का पालन करता है? असल में, यह backbone.js समस्या नहीं हो सकती है क्योंकि backbone.js कोई कैशिंग नहीं करता है। यह संग्रह में सभी मॉडलों को हमेशा प्राप्त करता है जो इसे प्राप्त करता है। हो सकता है कि आप अपने प्रश्न में कुछ ब्राउज़र एक्सएचआर विवरण जोड़ें और जो कुछ आप पूछ रहे हैं उसे थोड़ा सा स्पष्ट करें। –

उत्तर

57

यह आमतौर पर आईई पर एक समस्या है और रीढ़ की हड्डी के साथ इसका कोई लेना-देना नहीं है। आपको jQuery AJAX कॉल पर जाना होगा और दस्तावेज़ को देखना होगा। बैकबोन अपनी सिंक विधि के लिए jquery AJAX का उपयोग करता है। आप सभी ब्राउज़रों पर ajax कॉल के लिए मजबूर करने कुछ इस तरह कर सकते हैं:

$.ajaxSetup({ cache: false }); 

http://api.jquery.com/jQuery.ajaxSetup/

+1

धन्यवाद। सरल और सीधे आगे! –

+1

आपने मुझे इतना दर्द बचाया है जिसे आप नहीं जानते हैं। –

+0

@ErikAhlswede ಠ_ಠ – pabo

3

एक अन्य समाधान HTTP हेडर के साथ सर्वर साइड पर कैशिंग को रोकने के लिए है

php में

<?php 
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past 
?> 

या एक्सप्रेस और कॉफ़ीस्क्रिप्ट

के साथ node.js में ऐसा कुछ ऐसा
res.send results, 
    "Cache-Control": "no-cache, must-revalidate" 
    "Expires": "Sat, 26 Jul 1997 05:00:00 GMT" 
36

@ जूलियन की सिफारिश काम करेगी, लेकिन प्रत्येक AJAX अनुरोध सर्वर पर हिट करेगा और कैश से कुछ भी पुनर्प्राप्त नहीं किया जाएगा।

$.ajaxSetup({ cache: false }); 

ऐसा करने का एक और तरीका है। आप लाने में एक विकल्प के रूप में "कैश: झूठा" पास कर सकते हैं (नीचे कोड देखें)। लाभ यह है कि "कैश: झूठा" प्राप्त करने वाले सर्वर को हमेशा सर्वर पर हिट किया जाएगा और अन्य fetchs कैश से डेटा पुनर्प्राप्त कर सकते हैं। जिस एप्लिकेशन को मैं वर्तमान में लिख रहा हूं, डेटा और सामग्री को असीमित रूप से एक्सेस करें। कभी-कभी मैं आइटम को कैश से पुनर्प्राप्त करना चाहता हूं और कभी-कभी मैं सर्वर को हिट करना चाहता हूं।

http://documentcloud.github.com/backbone/#Collection-fetch

jQuery.ajax विकल्प भी सीधे लाने के रूप में विकल्प, इसलिए एक पृष्ठवार संग्रह की एक विशेष पृष्ठ लाने में पारित किया जा सकता: Documents.fetch ({डेटा: {पेज: 3}})

आप इस कोड के समान संग्रह की fetch विधि को भी ओवरराइड कर सकते हैं।

var PlanMembers = Backbone.Collection.extend({ 
    ... 
    fetch: function (options) { 
     options = options || {}; 
     options.cache = false; 
     return Backbone.Collection.prototype.fetch.call(this, options); 
    } 
    ... 
}) 

। करने के लिए लाने के

planMembers.fetch({ 
      cache: false, //Hit the server 
      success: function() { 
       var recoveryTeam = planMembers.select(function (planMember) { 
        return planMember.get("TeamMemberRole") == "RecoveryTeam"; 
       }); 

       var otherMembers = planMembers.select(function (planMember) { 
        return planMember.get("TeamMemberRole") == "Other"; 
       }); 

       new App.Views.Index({ collection: { name: "Team", members: recoveryTeam }, el: $('#recoveryTeam') }); 

       new App.Views.Index({ collection: { name: "Team", members: otherMembers }, el: $('#otherTeam') }); 
      }, 
      error: function() { 
       alert('failure'); 
       showErrorMessage("Error loading planMembers."); 
      } 
     }); 
+8

इसका परीक्षण किया गया, और बैकबोन 0.9.10 में विकल्प पैरामीटर शून्य है। मैंने यह कर लिया: 'fetch: फ़ंक्शन (विकल्प) {विकल्प = विकल्प || {}; options.cache = झूठा; वापस Backbone.Collection.prototype.fetch.call (यह, विकल्प);} ' –

+0

यह उत्तर, @ PålOliver के अतिरिक्त के साथ निश्चित रूप से जाने का तरीका है। बैकबोन (और अन्य) और आवश्यकता हमें वैश्विक निर्भरताओं से बचने में मदद करें। स्पष्ट होने के नाते सबसे अच्छा विकल्प आईएमओ है। – Hypnovirus

0

जोड़ा जा रहा है 'कैश: झूठी':

मैं नीचे "झूठे कैश" जोड़ा काम लाने के लिए!

this.foo.fetch({ cache:false }); 

मैं एक बग को ठीक करने में सक्षम था जो केवल आईई में दिखाई देता था जब देव उपकरण का उपयोग नहीं किया जा रहा था।

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