में कोई ऑब्जेक्ट अपडेट करना मैं एक कोणीय 2 ऐप के लिए @ ngrx/store का उपयोग कर रहा हूं।ngrx/store
मेरी दुकान में Book
ऑब्जेक्ट्स की एक सूची है। मैं उन वस्तुओं में से एक में एक फ़ील्ड अपडेट करना चाहता हूं। मुझे पुस्तक उदाहरण का एक अवलोकन भी होता है जिसे मैं अपडेट करना चाहता हूं (कहें, selectedBook
)।
अद्यतन करने के लिए मैं UpdateBookAction
के साथ रेड्यूसर को कॉल करने का इरादा रखता हूं, और नई पुस्तक का एक पेलोड। तो मैं selectedBook
की सदस्यता ले कर और फिर ऑब्जेक्ट.साइन() को कॉल करके मौजूदा बुक ऑब्जेक्ट की गहरी प्रतिलिपि बना देता हूं।
लेकिन जब मैं प्रतिलिपि के किसी एक फ़ील्ड में लिखने का प्रयास करता हूं तो मुझे निम्न त्रुटि मिलती है। (यह वही त्रुटि अगर मैं दुकान में बुक वस्तु को सीधे लिखने की कोशिश करने के लिए थे मैं होता है।)
त्रुटि
Cannot assign to read only property 'name' of object '#<Object>' at ViewWrappedError.BaseError [as constructor]
कोड
ngOnInit() {
this.book$ = this.store.let(fromRoot.getSelectedBook);
//...
}
someFunction() {
//...
this.book$.subscribe(book => {
let updatedBook = Object.assign({}, book);
updatedBook.name = 'something else'; // <--- THIS IS WHAT THROWS
let action = new BookUpdateAction(updatedBook);
this.store.dispatch(action);
}
}
टिप्पणियों के बाद स्पष्टीकरण
मैं इस धारणा के तहत था कि मुझे एक पेलोड के साथ कार्रवाई हो सकती है जो स्टोर की पूरी स्थिति नहीं थी। (वास्तव में यह आवश्यक लगता है, नहीं?) मुझे विश्वास है कि यह दस्तावेज दिया गया है।
Action = UPDATE, payload = {'id': 1234, 'name': 'something new'}
के रूप में उल्लेख किया है, मैं इस तरह है कि कॉल करने पर इरादा:
कार्रवाई मैं लेने के लिए देख रहा हूँ कुछ इस तरह है
this.store.dispatch(action);
मुमकिन है हुड के नीचे
, ngrx है (अपरिवर्तनीय) वर्तमान स्थिति के साथ reducer करने के लिए मेरी कार्रवाई गुजर रहा है।
तो वहां से, सब कुछ ठीक काम करना चाहिए। रेड्यूसर के अंदर मेरा तर्क मौजूदा स्थिति को विचलित नहीं करता है, यह बस मौजूदा स्थिति में से एक नया बनाता है और मैंने जो पेलोड पास किया है, वह
असली सवाल यह है कि मैं उचित रूप से नया कैसे बना सकता हूं " objectToUpdate "जैसे कि मैं इसे पेलोड के रूप में पास कर सकता हूं।
this.book$.subscribe(book => {
let updatedBook = new Book();
updatedBook.id = book.id;
//set all other fields manually...
updatedBook.name = 'something else';
let action = new BookUpdateAction(updatedBook);
this.store.dispatch(action);
}
लेकिन हम सिर्फ दो क्षेत्रों यहाँ बात नहीं कर रहे ... अगर मेरी किताब कई क्षेत्रों है क्या:
मैं कुछ इस तरह कर सकता है? क्या मुझे एक फ़ील्ड को अपडेट करने के लिए हर बार एक नई पुस्तक खरोंच से मैन्युअल रूप से निर्माण करना है?
मेरा समाधान Object.assign({}, book)
(और पुराने को म्यूटेट नहीं कर रहा है) का उपयोग करके एक गहरी प्रतिलिपि करना था और बाद में उस क्षेत्र को अपडेट करना जो मैं स्पर्श करना चाहता था।
क्या आप पुस्तक ऑब्जेक्ट की परिभाषा पोस्ट कर सकते हैं? ऐसा लगता है कि यह केवल एक लिखने की संपत्ति के साथ एक मुद्दा हो सकता है। –
हां, पुस्तक परिभाषा देखना उपयोगी होगा। क्या आपको एक ही कॉल में ऐसा करने में एक ही समस्या है? जैसे 'ऑब्जेक्ट.साइन ({}, पुस्तक, {नाम:' कुछ और '})'? – rob3c