2013-02-11 10 views
7

मुझे राउटर में मेनू लिंक की सरणी सेट करने की आवश्यकता है और फिर उन्हें #Each का उपयोग करके टेम्पलेट में प्रस्तुत करना होगा। लेकिन लगता है जैसे # लिंक्स हेल्पर चर को पहचान नहीं पाया। इसे कैसे हल किया जा सकता है?एम्बर हेल्पर्स (लिंक या आंशिक) में स्ट्रिंग चर का उपयोग कैसे करें?

रूटर:

Lite.DashboardRoute = Em.Route.extend({ 
    setupController: function(controller, model) { 
    this.controllerFor('application').set('mainControls', [ {path: 'widgets.new', name: 'Add', classes: 'btn btn-success icon-ok-sign'} ]) 
    } 
}) 

लिंक अनुप्रयोगों टेम्पलेट में प्रतिपादन:

{{#each link in mainControls}} 
    {{#linkTo link.route class=link.classes}} {{link.name}} {{/linkTo}} 
{{/each}} 

त्रुटि संदेश:

ember.debug.js:51 Error: assertion failed: The route link.route was not found 

एंबर संस्करण:

// Version: v1.0.0-pre.4 
// Last commit: 855db1a (2013-01-17 23:06:53 -0800) 
+0

ऐसा लगता है कि 'linkTo 'सहायक पहले शब्द को वर्बैटिम रूट नाम के रूप में पहचानता है, न कि परिवर्तनीय का नाम .. –

+0

हां, लेकिन मैं विभिन्न यूआरएल के साथ लिंक की सूची कैसे प्रस्तुत कर सकता हूं? – hoblin

उत्तर

7

आप अभी भी केन के विकल्प के साथ संघर्ष कर रहे हैं, तो पर bindAttr उपयोग करने की आवश्यकता है, तो आप कुछ इस तरह की कोशिश करना चाहते हो सकता है:

{{#each link in mainControls}} 
    <a {{action "goToLink" link}} {{bindAttr class="link.classes"}}> 
     {{link.name}} 
    </a> 
{{/each}} 

और फिर आपको कार्रवाई को संभालने के लिए goToLink फ़ंक्शन की आवश्यकता होगी। आप इसे अपने संग्रह पर डाल सकते हैं, लेकिन यदि आप नहीं करते हैं, यह अपने मार्ग हैंडलर, जो, सिद्धांत रूप में, चीजों को वास्तव में आसान बनाना चाहिए करने के लिए बुलबुला ऊपर माना जाता है:

App.MyRoute = Ember.Route.extend({ 
    // ... stuff ... 

    actions: { 
      goToLink: function(item) { 
       this.transitionTo(item.route); 
      } 
    } 
}); 

आप कार्रवाइयों के बारे में अधिक पढ़ सकते हैं , यहाँ: http://emberjs.com/guides/templates/actions/

अद्यतन

मैं एक साथ आप के लिए एक बेला डाल दिया है, नवीनतम और सबसे बड़ी एंबर का उपयोग कर।

मैंने पाया कि कुछ तकनीकी सीमाओं के कारण मैंने ऊपर दिए गए सुझाव पर थोड़ा बदलाव किया है।

विशेष रूप से, रूट केवल रूट द्वारा आंतरिक रूप से बनाए गए नियंत्रकों के लिए क्रियाओं को संभालने में सक्षम लगता है। यह हमारे नेविगेशन मेनू के लिए एक समस्या है, क्योंकि आप स्क्रीन बदल रहे हैं, जबकि आप अभी भी स्क्रीन पर हैं।

यदि मैंने मेनू को प्रस्तुत करने के लिए हैंडलबार्स "रेंडर" सहायक का उपयोग करने के लिए स्विच किया है, तो राउटर कार्रवाई को संभालने के लिए तैयार नहीं है। हालांकि, वर्तमान राउटर को नियंत्रक पर "भेजने" के लिए हमेशा बबल श्रृंखला में लगाया जाता है। तो, मेरे पास नियंत्रक राउटर को चेन पर एक घटना भेजता है, और हमें अपना रूटिंग आनंद मिलता है।

आप बेला, यहाँ पा सकते हैं: http://jsfiddle.net/Malkyne/fh3qK/

अद्यतन 2

यहाँ केवल के साथ एक ही बेला का एक और संस्करण है, (अजीब तरह से गैर-दस्तावेजी) ApplicationRoute सीधे कार्रवाई को संभालने के लिए इस्तेमाल किया जा रहा, नियंत्रक को बिना किसी रिलेइंग के: http://jsfiddle.net/Malkyne/ydTWZ/

+0

आपने किसी के प्रश्न पर उत्तर देने के लिए एक प्रभावशाली काम किया है। धन्यवाद =) यह अच्छा समाधान है, कम से कम यह बेहतर है कि मैं अब जो उपयोग करता हूं (मैं एक आंशिक में #if ब्लॉक में लिपटे हार्डकोडेड पथ के साथ प्रत्येक संभावित लिंक प्रस्तुत करता हूं)। वैसे भी, मैं एम्बर हेल्पर्स को परिवर्तनीय नामों का समर्थन जोड़ने के लिए ember.js github पर सुविधा अनुरोध जोड़ दूंगा। लेकिन तब तक मैं आपके समाधान का उपयोग करूंगा। धन्यवाद फिर से =) – hoblin

+0

क्या आप वर्तमान आइटम में 'सक्रिय' वर्ग जोड़ सकते हैं? –

+0

विल्म, यह पता चला है कि ** एप्लिकेशन कंट्रोलर ** पर उचित रूप से आसान (संभवतः अनियंत्रित) संपत्ति है, जिसे उचित रूप से ** currentPath ** कहा जाता है। इसमें आपका वर्तमान मार्ग पथ शामिल है। आप ** आइटम्स इटैम कंट्रोलर को ** जरूरतों के साथ बना सकते हैं: ['application'] ** इसमें, और उसमें किसी भी तर्क का उपयोग करें, जो आप चाहते हैं कि संदर्भ ** नियंत्रक.एप्लिकेशन.currentPath ** संपत्ति (जैसे इसे अपने मार्ग से तुलना करना मूल्य)। मैंने आपके लिए उपरोक्त पहेली का एक मॉड बनाया है, ताकि आप इसे क्रिया में देख सकें: http://jsfiddle.net/Malkyne/fRsAv/ – Tess

4

आप linkTo सहायक अंदर चर का उपयोग नहीं कर सकते हैं, तो आप एक लंगर टैग, इसके बजाय

<a {{bindAttr href="link.route" class="link.classes"}}>link</a> 
+0

मैंने कोशिश की। लेकिन यह लिंक एम्बर लिंक के रूप में काम नहीं करता था। यह नियमित लिंक के रूप में काम करता है। – hoblin

+0

एम्बर लिंक द्वारा आपका क्या मतलब है, लिंकटो एपीआई के लिए समर्थन के साथ एक नियमित एंकर टैग है। जब तक आप लिंक करते हैं। रूट ठीक से सेट है, लिंक ठीक से काम करना चाहिए। – ken

+0

[pastie] पर मेरी टिप्पणी देखें (http://pastie.org/6121367) – hoblin

1

एम्बर.जेएस आरसी 6 के रूप में, एम्बर को कठोर कोडित मूल्यों के रूप में समझने के बजाय गुणों के रूप में मार्गों को देखने के लिए कॉन्फ़िगर करना संभव है। आरसी 6 के रूप में।1, इसके लिए एक पर्यावरण चर परिभाषित करने की आवश्यकता है:

ENV.HELPER_PARAM_LOOKUPS = true 

एम्बर.जेएस लोड होने से पहले।

Example: Using a variable in a #linkTo helper in Ember

0

यह धागा तो नया नहीं है और मुझे पता है अगर नवीनतम संस्करणों की नहीं है: Quoteless route param in linkTo performs lookup

यहाँ एक jsFiddle के रूप में एक पूर्ण काम कर उदाहरण है: अधिक जानकारी के लिए, निम्न पुल अनुरोध दिखाई एम्बर के इस मुद्दे के लिए एक अलग समाधान प्रस्तुत करता है लेकिन एम्बर संस्करण 1.11 पर यह ठीक काम करता है।

समाधान इनलाइनlink-to का संस्करण है।

यह सहायक के समान काम करता है (हां, यह आपके वर्तमान मार्ग के आधार पर active कक्षा को टॉगल करेगा) और आपको गतिशील पैरामीटर पारित करने की अनुमति देता है।

component.js

mainControls: [ 
    { path: 'widgets.new' }, 
    { name: 'Add' }, 
    { classes: 'btn btn-success icon-ok-sign' } 
] 

component.hbs इस दृष्टिकोण abut

{{#each link in mainControls}} 
    {{link-to link.name link.route class=link.classes}} 
{{/each}} 

अधिक जानकारी पाया जा सकता है here: लेखक का स्थिति का अनुकरण है, हम की तरह कुछ होगा।