2013-08-01 24 views
10

मेरा पोस्ट और पुट सर्वर पर दिखाई देने वाली इकाई की वर्तमान स्थिति को वापस कर देता है। मैं सर्वर कॉल के बाद अपने मॉडल ऑब्जेक्ट को अपडेट करने के लिए रेस्टैंगुलर कैसे बता सकता हूं?सर्वर प्रतिक्रिया के साथ पुनर्विक्रेता मॉडल ऑब्जेक्ट को कैसे अपडेट करें?

बस मामले में - क्यों? क्योंकि सर्वर को सहेजने/अपडेट करने के दौरान कुछ फ़ील्ड की गणना हो सकती है। चूंकि अन्य क्लाइंट्स द्वारा समवर्ती अपडेट हो सकते हैं और मैं यह सुनिश्चित करना चाहता हूं कि वर्तमान में अपडेट करने वाला क्लाइंट अद्यतित है।

अब तक मैं सिर्फ पाया इस:

var res = {foo: "bar"}; 
var cb = function(response) { 
    $.extend(res, response); 
} 
// POST/create 
Restangular.all("resource").post(res).then(cb); 

// PUT/update 
res.put().then(cb); 

यह इतना गंदा और एक ही समय है कि मुझे लगता है एक बेहतर तरीका होना चाहिए पर आम लगता है।

संपादित

कोड ऊपर केवल दो अलग-अलग कार्यों को दर्शाता है। मेरा लक्ष्य नहीं इकाई बनाने के बाद सर्वर को अद्यतन भेजने के लिए, लेकिन क्लाइंट पर स्थिति अद्यतन कर रहा है। यदि आप करेंगे, सर्वर के साथ राज्य सिंक्रनाइज़ करना।

जब मैं एक वस्तु पोस्ट:

var res = {foo: "bar"}; 
Restangular.all("resource").post(res); 

सर्वर प्रतिक्रिया के साथ शरीर है:

{"foo": "bar", "id": 15} 

... तो मैं Restangular अद्यतन और स्वचालित रूप से res वस्तु restangularize चाहते हैं, तो यह है आईडी, put() आदि

अब एक अलग/पूरक परिदृश्य हो सकता है। जब मैं एक Restangular वस्तु डाल:

var res = Restangular.one("resource", 15).get(); 
// returns {foo: "bar", id: 15} 
res.put(); 

सर्वर हमेशा वस्तु की वर्तमान स्थिति है, जो हो सकता है के साथ उत्तर:

{"foo": "buzz", "id": 15} 

... इसलिए मैं Restangular res अद्यतन करने के लिए स्वचालित रूप से करने के बाद चाहते हैं यह पुट

+2

वास्तव में इस के लिए एक प्रतिक्रिया देखना चाहते हैं। @mgonto, क्या कोई विशिष्ट कारण है कि यह पहले से क्यों नहीं हुआ है? हो सकता है कि डिफ़ॉल्ट आरईएसटी कार्यान्वयन POSTs और PUTs के बाद डेटा वापस न करें, केवल एक स्टेटस कोड? – jlb

+1

हां, इस बात की कोई गारंटी नहीं है कि एक रेस्टी वेब सेवा ऑब्जेक्ट को इसे बनाए जाने, बदलने, आदि के बाद प्रश्न में वापस कर देगी। इसके लिए सामान्य रूप केवल $ scope.foo.put() है। (फ़ंक्शन सफलता (newFoo) {$ scope.foo = newFoo;})। –

उत्तर

4

मैं रेस्टैंगुलर का निर्माता हूं।

यदि मैं आपको सही ढंग से समझता हूं, तो आप पहले पोस्ट करना चाहते हैं, और फिर डाल दें? उस स्थिति में आप कुछ ऐसा कर सकते हैं:

var res = {foo: 'bar'}; 
Restangular.all('resource').post(rest).then(function(response) { 
    res = response; 
    res.put() 
}) 

मुझे नहीं पता कि मैं सही ढंग से समझ गया हूं या नहीं।

यह काम करता है आशा है कि

+0

प्रतिक्रिया के लिए धन्यवाद, हालांकि यह मेरी समस्या नहीं है। वे दो अलग-अलग कार्य हैं। मैं अधिक विस्तार से प्रश्न संपादित करूंगा। –

+1

मुझे लगता है कि वह क्या चाहता है किसी भी सर्वर के पक्ष में परिवर्तन (जैसे टाइमस्टैम्प को अपडेट करना या ऑब्जेक्ट में संशोधनों के प्रकार द्वारा संशोधित) स्वचालित रूप से, या आसानी से, क्लाइंट ऑब्जेक्ट को '.then() से करने के बिना अपडेट करना '। आप इसे सीधे सेट नहीं कर सकते हैं क्योंकि आप कोई अतिरिक्त मॉडल जानकारी खो देंगे और '$ .extend() ' – John

+4

हे, कुछ संपादित करने के बाद, आप या तो _.extend या Restangular 1.2 पर नई सुविधा का उपयोग कर सकते हैं। 0 $ ऑब्जेक्ट। res = res.put()। $ ऑब्जेक्ट; – mgonto

0

इस प्रयास करें:

res.put().then(function(data) { 
    angular.extend(res, data); 
}); 
संबंधित मुद्दे