2013-01-23 34 views
5

एम्बर के साथ खेलना, मैंने पाया कि कभी-कभी मॉडल नियंत्रक की content संपत्ति पर संग्रहीत होता है, कभी-कभी मॉडल सीधे नियंत्रक पर भी उपलब्ध होता है। हालांकि, यह मामला नहीं है, जब यह मामला है।टेम्पलेट से मॉडल तक पहुंच

मुझे इसे एक उदाहरण के द्वारा समझाएं जो मुझे अपने एम्बर एमवीसी को इकट्ठा करते समय मिला।

सेटअप एक - शुरुआत

  • मैं एक कस्टम Member वस्तु परिभाषित, इसी MemberRoute, MemberView वर्गों और एक टेम्पलेट नाम member साथ।
  • Member वस्तु कुछ विशेषताओं ऐसे id, nickname, आदि
  • नोट के रूप में था: प्रपत्र MemberController का कोई नियंत्रक परिभाषित किया गया था, इस प्रकार एंबर की प्रथा के अनुसार, यह अपने आप ही नियंत्रक प्रदान करता है।

सेटअप बी - अनुकूलन

  • सेटअप एक के रूप में एक ही है, लेकिन अब वहाँ एक MemberController परिभाषित है कि कुछ कार्रवाई तरीकों कि टेम्पलेट के भीतर से ट्रिगर कर रहे हैं होता है।

अजीब व्यवहार (resp। क्या मैं पूरी तरह से नहीं समझते हैं)

  • सेटअप एक में, मैं Member का उल्लेख कर सकते है सीधे {{id}} या {{nickname}} साथ जिम्मेदार बताते हैं।
  • सेटअप बी में, मैं किसी को मेरी मदद कर सकता है समझने के लिए क्यों अंतर और जहां अंतर {{content.id}} या {{content.nickname}}

उपयोग करने के लिए के रूप में एंबर के दस्तावेज़ में दर्ज है, MemberView

setupController : function(controller, member) { 
    controller.set('content', member); 
}, 

करता है तो, है? वर्तमान में, मेरा अनुमान है या तो

  • होगा कि टेम्पलेट के संदर्भ में अलग है (संभवतः वहाँ एक कोड नियंत्रक के सेटअप में लापता टुकड़ा है?)

या

  • स्वचालित नियंत्रक जो स्वचालित रूप से एम्बर द्वारा प्रदान किया जाता है, में कुछ अतिरिक्त जादू है जो अनुकूलित नियंत्रकों के लिए सीधे उपलब्ध नहीं है।

इसे समझने में कोई भी सहायता अत्यधिक सराहना की जाती है। जहां तक ​​इस तक आने में काफी समय लगा है। मैंने पहले सोचा था कि यह परियोजना सेटअप द्वारा आवश्यक जेएसएस के साथ मॉड्यूलरलाइजेशन हो सकता है (ठीक है, मुझे अभी भी लगता है कि इसका प्रभाव हो सकता है)। एम्बर v1.0pre4 है।

अग्रिम धन्यवाद! पैट्रिक

उत्तर

8

तो, किसी ने मुझसे समझने के लिए क्यों अंतर और जहां अंतर नहीं है मदद कर सकता है? वर्तमान में, मेरा अनुमान होगा कि टेम्पलेट का संदर्भ अलग है (संभवतः नियंत्रक के सेटअप में एक कोड टुकड़ा गायब है?) या स्वचालित नियंत्रक जो स्वचालित रूप से एम्बर द्वारा प्रदान किया जाता है, में कुछ अतिरिक्त जादू है अनुकूलित नियंत्रकों के लिए सीधे उपलब्ध नहीं है।

यह अपने कोड देखे बिना यकीन के लिए कहना मुश्किल है, लेकिन मेरी सबसे अच्छी अनुमान है कि अपने MemberController फैली Ember.Controller है। एम्बर द्वारा प्रदान किया गया डिफ़ॉल्ट (इस परिदृश्य में) Ember.ObjectController होता। यदि यह तुम क्या चाहते हो, करने के लिए अपने MemberController परिभाषा बदलने:

App.MemberController = Ember.ObjectController.extend({ 
    myProperty: 'value' 
}); 

एक objectController में कार्य करता है के रूप में यह करने के लिए प्रॉक्सी content संपत्ति है, आम तौर पर है कि एक एंबर मॉडल है। तो अगर चीजें सही ढंग से वायर्ड हो जाती हैं तो आपको 'सामग्री' संपत्ति के माध्यम से किसी मॉडल तक पहुंचने की आवश्यकता नहीं है। क्या तुमने कभी कुछ ऐसा दिखाई देता है तो:

{{content.id}} or {{content.nickname}} 

यह एक संकेत है कि आप एक ObjectController में बदल जानी चाहिए है। EMBER GUIDES: REPRESENTING A SINGLE MODEL देखें! अधिक विस्तृत स्पष्टीकरण के लिए।

+0

सही, धन्यवाद माइकल। यह केवल व्याख्या नहीं है, लेकिन मेरे कोड में क्या गलत था। मेरे पास 'App.MemberController = Ember.Controller.extend ({}) था;'। कम से कम बग नियंत्रकों की बेहतर समझने देता है। फिर से thx! पी –

0

ObjectController नियंत्रक की सामग्री पर सेट ऑब्जेक्ट के प्रॉक्सी के रूप में कार्य करता है। जब कोई नियंत्रक परिभाषित नहीं किया जाता है, तो एम्बर आपके लिए एक नियंत्रक बनायेगा और रूट में model() function द्वारा परिभाषित किए गए किसी भी वस्तु को डिफ़ॉल्ट रूप से अपनी सामग्री सेट कर देगा। व्यवहार वही होना चाहिए चाहे आप अपना खुद का नियंत्रक परिभाषित करें या एम्बर को आपके लिए परिभाषित करें

टेम्पलेट में डिफ़ॉल्ट संदर्भ नियंत्रक स्वयं है यानी this = an instance of your controller or the generated one है। जब आप उस संदर्भ में उपनाम तक पहुंचने का प्रयास करते हैं, तो एम्बर पहले इसे नियंत्रक के खिलाफ हल करने का प्रयास करेगा और यदि कुछ भी नहीं मिला है, तो यह इसकी सामग्री के विरुद्ध हल करता है, यानी यदि आप पहले से ही इसे नियंत्रक की सामग्री पर मैन्युअल रूप से सेट करते हैं तो ऑब्जेक्ट।

अंत में, जब आप गतिशील यूआरएल, say /foo/id that resolves against /foo/:id उपयोग कर रहे हैं को छोड़कर मार्ग में model() function का कोई डिफ़ॉल्ट कार्यान्वयन है, एंबर, बशर्ते आईडी के साथ एक फू वस्तु लोड करने के लिए प्रदान की आईडी का उपयोग करता है इस प्रकार के लिए एक डिफ़ॉल्ट कार्यान्वयन प्रदान मॉडल() फ़ंक्शन। अंत में यह एक ही तंत्र के लिए उबाल जाता है, केवल आपकी सुविधा के लिए स्वचालित।

मेरा सुझाव है कि आप एम्बर द्वारा आपके लिए चीजों को स्वचालित करने के तरीके के बारे में अधिक जानकारी के लिए this पर सुनें। लेकिन जब प्रदर्शित होने वाली सामग्री की बात आती है, तो आपके पास नियंत्रक की सामग्री को मैन्युअल रूप से तार करने के लिए कोई जादू नहीं है।

+0

जैसा कि पहले से ही चिह्नित है, माइकल वास्तव में बिंदु प्राप्त कर लिया। लेकिन आपकी व्याख्याओं और दिलचस्प बातों के लिंक के लिए धन्यवाद। –

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