2015-06-07 6 views
26

transitionToRoute को एम्बर घटक के भीतर से साफ़ रूप से कैसे कहा जा सकता है?एम्बर संक्रमण आसानी से भेजने के बिना एक घटक में प्रवेश करें

यह घटक में नियंत्रक इंजेक्शन के साथ काम करता है और नियंत्रक के transitionToRoute फ़ंक्शन को कॉल करता है, हालांकि यदि संभव हो तो मैं कुछ और अधिक सुरुचिपूर्ण चाहता हूं।

यह वर्तमान में घटक की जावास्क्रिप्ट अंदर कैसा दिखता है:

// this.controller is injected in an initializer 
this.controller.transitionToRoute("some.target.route.name"); 

घटक की जावास्क्रिप्ट में अच्छे होगा क्या: इस विशेष घटक के रूप में sendAction का उपयोग किए बिना

transitionToRoute("some.target.route.name"); 

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

+0

संबंधित सवाल है कि पाठकों के हित के लिए हो सकता है::
एक घटक के अंदर से एक मार्ग के लिए संक्रमण http://stackoverflow.com/questions/22389384/transitiontorouteroute-from-inside-component –

उत्तर

3

आप आवेदन के किसी भी आवश्यक भाग तक पहुंच प्राप्त करने के लिए कंटेनर का उपयोग कर सकते हैं। आवेदन प्राप्त करने के लिए नियंत्रक:

this.container.lookup('controller:application') 

लेकिन आवेदन की संरचना के बारे में क्या - घटकों घटनाओं उत्पन्न करनी चाहिए - तो मेरी राय में यह sendAction उपयोग करने के लिए बेहतर है। क्योंकि भविष्य में आप स्थिति प्राप्त कर सकते हैं, जब आप (उदाहरण के लिए) इस तरह के व्यवहार को फिल्टर करने की जरूरत है या संक्रमण से पहले अन्य आवेदन विशेष तर्क

+1

यह नहीं है अनुशंसित है क्योंकि यह एक आंतरिक एपीआई का उपयोग करता है जो टूट सकता है। असल में कंटेनर तक पहुंच एम्बर 2.3 पर मुझे बहिष्कृत करना शुरू हो गया, मुझे लगता है, और अब इसे एक अलग इंटरफेस ('getOwner' मुझे लगता है) के साथ बदल दिया गया है। – Ernesto

64


अद्यतन कृपया करने के लिए कैसे अन्य अधिक हाल ही में उत्तर देखने इसे नए एम्बर संस्करणों में कम कोड के साथ प्राप्त करें, और अगर वे आपके लिए काम करते हैं तो उन्हें वोट दें - धन्यवाद!



घटकों में router सम्मिलित करें और this.get('router').transitionTo('some.target.route.name') कहते हैं।

सभी घटकों में router इंजेक्षन करने के लिए निम्न सामग्री के साथ app/initializers/component-router-injector.js में एक प्रारंभकर्ता लिखें: एक घटक में

// app/initializers/component-router-injector.js 
export function initialize(application) { 
    // Injects all Ember components with a router object: 
    application.inject('component', 'router', 'router:main'); 
} 

export default { 
    name: 'component-router-injector', 
    initialize: initialize 
}; 

नमूना उपयोग:

import Ember from 'ember'; 

export default Ember.Component.extend({ 
    actions: { 
    submit: function() { 
     this.get('router').transitionTo('some.target.route.name'); 
    } 
    } 
}); 
+7

केवल एक घटक में इंजेक्ट करने के लिए: http://stackoverflow.com/a/33335230/273743 –

+0

यह वास्तव में काम कर रहा है, धन्यवाद एलियट साइक्स –

+1

2017 पाठकों के लिए: 'sendAction' के साथ समस्या यह है कि आपको उस पर बुलबुला रखना होगा अगर आपके घटक घोंसला हैं। यदि आप सीधे घटक से मार्ग पर एक कार्रवाई भेज सकते हैं, तो यह एक गैर-मुद्दा बन जाता है। अंततः एम्बर के पास रूटेबल घटक होंगे जो आपको सीधे मार्ग पर बात करने की अनुमति देते हैं। तब तक, उस मार्ग पर सीधे एक विधि को कॉल करने के लिए 'एम्बर-रूट-एक्शन-हेल्पर' का उपयोग करें, जिस पर आपका घटक मौजूद है - जैसे 'ट्रांजिशन टू ('ऑफ-ऑफ-रूट') '। यहां और पढ़ें: http://dockyard.com/blog/2016/02/19/best-practices-route-actions – PhillipKregg

3

आप केवल रूटर उपयोग करना चाहते हैं एक विशिष्ट घटक या सेवा या नियंत्रक में, आप टी को आजमा सकते हैं उसका:

निजी सेवा -routing के साथ एक विशेषता आरंभ करें। - क्योंकि यह अभी तक एक सार्वजनिक एपीआई नहीं है।

router: service('-routing'), 

और फिर किसी भी कार्रवाई विधि या सेवा या घटक के अंदर अन्य समारोह के अंदर:

this.get('router').transitionTo(routeName, optionalParams); 

नोट: यह एक नियंत्रक में transitionToRoute हो जाएगा।

2

जनवरी 22, 2018 अद्यतन
Ember 2.15 के रूप में, public router service के चरण 1 कार्यान्वित किया जाता है।

import { inject as service } from '@ember/service'; 

export default Ember.Component.extend({ 
    router: service(), 

    actions: { 
    someAction() { 
     this.get('router').transitionTo('index'); 
    } 
    } 

}); 
संबंधित मुद्दे