6

कहें कि मेरे पास Action ऑब्जेक्ट्स की एक सूची है, जो एम्बर मॉडल से मेल खाती है। प्रत्येक में कुछ गुण (टाइमस्टैम्प) और detail विशेषता होती है, जो बाद में detail एस (मनमाने ढंग से गहरी घोंसले) को शामिल कर सकती है। आप विवरणों को नेस्टेड सूचियों के रूप में सोच सकते हैं।एम्बर.जेएस रिकर्सिव नियंत्रक और विचार

मैं एक यूआई लिखना चाहता हूं जो किसी भी Action ऑब्जेक्ट के लिए detail के आसान संपादन (मूल्यों की स्वत: पूर्णता, आसान प्रतिलिपि और पेस्ट, तत्वों को पुन: व्यवस्थित करना आदि) की अनुमति देता है।

अभी, मेरी DetailView टेम्पलेट रिकर्सिवली प्रस्तुत करना होगा अतिरिक्त DetailView रों:

{{#if view.content.hasChildren}} 
    {{#each child in view.content.children}} 
     {{#DetailView contentBinding=child}} 
    {{/each}} 
{{#else}} 
    {{#EditDetailView contentBinding=view.content.value}} 
{{/if}} 

इसलिए प्रत्येक DetailsView विवरण में एक नोड से मेल खाती है पेड़ आपत्ति है।

लेकिन मुझे स्पष्ट नहीं है कि मिश्रण में नियंत्रकों को कैसे जोड़ना है - अतिरिक्त राज्य मुझे स्टोर करने/कार्यान्वित करने की कार्यक्षमता की आवश्यकता है (उदाहरण के लिए, विवरण दृश्य में प्रदर्शन के लिए विस्तार वस्तु से मूल्यों को परिवर्तित करना; डालने/हटाने के लिए ईवेंट को संभालना/पुनर्वितरण तत्व; विवरण पेड़ की संरचना को बदलना) जो न तो मॉडल में और न ही दृश्य में है।

आदर्श रूप से मेरे पास DetailsControllerDetails प्रति DetailsView प्रॉक्सी के रूप में कार्यरत होगा। क्या मैं गतिशील रूप से नियंत्रकों को तुरंत चालू कर सकता हूं और एक दृश्य टेम्पलेट के भीतर अपनी सामग्री सेट कर सकता हूं? नए एम्बर राउटर की मेरी समझ किसी दिए गए मार्ग में नियंत्रकों और दुकानों को सेट करना है; हालांकि, ऐसा प्रतीत नहीं होता है क्योंकि कोई रूटिंग नहीं किया जा रहा है। रिकर्सिव नियंत्रकों/विचारों/मार्गों को संभालने के तरीके के बारे में सभी सुझाव/अंतर्दृष्टि का स्वागत है।

मैं EmberJS Nested Views and Controllers पर एक नज़र लिया है, लेकिन यह है कि मैं सभी Detail रों के लिए एक एकल ArrayController है, भले भर Action रों ... यह या तो नेस्टेड विवरण के वृक्ष संरचना की रक्षा नहीं होता प्रस्ताव रखता है।

मैंने Recursive view in handlebars template not working after upgrading to Ember 0.9.6 पर भी देखा है लेकिन समाधान नियंत्रकों के बारे में कुछ भी नहीं कहता है।

उत्तर

7

** अद्यतन फ़रवरी 20, {{control}} सहायक के लिए 2013 **

API दस्तावेज़ अब उपलब्ध here है। यह चेतावनी देता है कि "नियंत्रण सहायक वर्तमान में विकास में है और इसे प्रयोगात्मक माना जाता है।"

इसे सक्षम करने के लिए, एम्बर की आवश्यकता से पहले ENV.EXPERIMENTAL_CONTROL_HELPER = true सेट करें।

** अद्यतन फ़र, 3, 2013 **

एक नया सहायक {{control}} एंबर में जोड़ा गया है, पुन: प्रयोज्य दृश्य को लागू करने प्रस्ताव। तो एक DetailsController प्रॉक्सी DetailsView प्रति एक Details के लिए तुम सिर्फ कर सकते हैं:

{{control 'detail' child}} 

उदाहरण


के लिए the {{control}} tests देखें आदर्श रूप में मैं एक DetailsController की सेवा एक प्रॉक्सी के रूप में DetailsView प्रति एक विवरण होगा।क्या मैं गतिशील रूप से नियंत्रकों को तुरंत चालू कर सकता हूं और एक दृश्य टेम्पलेट के भीतर अपनी सामग्री सेट कर सकता हूं?

आमतौर पर जिस तरह से यह करने के लिए हैंडल {{render}} सहायक है, जो किसी उपयुक्त दृश्य और नियंत्रक के साथ एक टेम्पलेट renders के माध्यम से किया जाएगा। दुर्भाग्यवश आप एक ही टेम्पलेट को एक से अधिक बार सम्मिलित करने के लिए {{render}} का उपयोग नहीं कर सकते हैं, इसलिए इसका उपयोग {{each}} ब्लॉक के भीतर नहीं किया जा सकता है।

हाल ही में इस विषय पर एक लंबी चर्चा हुई थी। देखें: Non-Singleton Controller Discussion!

दो समाधान प्रस्तावित किए गए थे। पहले में itemControllerClass संपत्ति को ArrayController में जोड़ना शामिल है। यदि यह प्रॉपर्टी सेट की गई थी, तो ArrayController स्वचालित रूप से निर्दिष्ट कक्षा में नई सामग्री लपेट लेगा। यह कुछ हफ्ते पहले एम्बर में जोड़ा गया था और अधिकांश उपयोग मामलों का ख्याल रखता है, जहां आपके पास वस्तुओं की एक फ्लैट सूची है और प्रत्येक को प्रॉक्सी में लपेटना चाहते हैं।

दूसरा प्रस्ताव, पुन: प्रयोज्य दृश्य, आपको एक दृश्य नियंत्रक को एक दृश्य प्रदान करने की अनुमति देता है।

{{view UI.Calendar dateBinding="post.startDate" controllerClass="App.CalendarController"}} 

यह प्रत्येक UI.Calendar विजेट, विजेट के जीवन चक्र से बंधा किया जाएगा, जिसके लिए App.CalendarController का एक उदाहरण बन जाएगा। आज तक यह लागू नहीं किया गया है। {{view}} should have an option to create a controller देखें! नवीनतम स्थिति के लिए।

तो AFAIK अच्छा तरीका आपके द्वारा उल्लिखित उपयोग के मामले को पूरा करने के लिए नहीं है। इस बीच, डेटा को बाध्यकारी डेटा:

{{view App.DetailView contentBinding="child"}} 

और उसके बाद दृश्य में कुछ तर्क स्वयं उचित लगता है। यदि/जब पुन: प्रयोज्य दृश्य समर्थन मास्टर में जोड़ा जाता है तो आप उस तर्क को नियंत्रक में खींच सकते हैं।

देखें: https://github.com/emberjs/ember.js/issues/1766

+0

बहुत बढ़िया है, यह मैं वास्तव में क्या देख रहा था है! –

+0

यदि कोई कार्यान्वयन उदाहरण की तलाश में है तो: [jsbin] (http://jsbin.com/ogapux/9/edit) – RyanJM

+0

'नियंत्रण' सहायक को कम किया गया है :(मुझे लगता है कि आपको 'रेंडर' का उपयोग करना होगा 'अब, लेकिन मुझे "अधिकतम कॉल स्टैक आकार पार हो गया" त्रुटियां मिल रही हैं। – cgenco