2012-06-15 13 views
5

जब मैं एम्बर राउटर का उपयोग करता हूं, तो मैं नियंत्रक से जुड़े टेम्पलेट में कार्रवाइयों को कैसे परिभाषित कर सकता हूं?एम्बर.जेएस राउटर कंट्रोलर पर कार्रवाई

एक उदाहरण यहाँ है: http://jsfiddle.net/KvJ38/3/

Unter मेरा प्रोफ़ाइल दो कार्यों हैं: एक राज्य पर परिभाषित किया गया है, और काम कर रहा है दो नियंत्रक पर परिभाषित किया गया है। मैं इसे कैसे काम कर सकता हूं या क्या मुझे एक और दृष्टिकोण का उपयोग करना चाहिए?

App.Router = Em.Router.extend({ 
    enableLogging: true, 
    location: 'hash', 

    root: Em.State.extend({ 
    // EVENTS 
    goHome: Ember.State.transitionTo('home'), 
    viewProfile: Ember.State.transitionTo('profile'), 

    // STATES 
    home: Em.State.extend({ 
     route: '/', 
     connectOutlets: function(router, context) { 
     var appController = router.get('applicationController'); 
     appController.connectOutlet(App.HomeView); 
     } 
    }), 

    // STATES 
    profile: Em.State.extend({ 
     route: '/profile', 
     connectOutlets: function(router, context) { 
      var appController = router.get('applicationController'); 
      appController.connectOutlet(App.ProfileView); 
     } 
    }), 

    one: function() { 
     alert("eins"); 
    }, 
    }) 
}); 

उत्तर

12

एक कार्रवाई की डिफ़ॉल्ट लक्ष्य रूटर है, लेकिन आप टेम्पलेट में एक दूसरे से परिभाषित कर सकते हैं:

{{action two target="controller"}} 

और "App.ProfileController" में एक "दो" समारोह जोड़ें।

अद्यतन

इस उत्तर अब उम्मीद है कि सही था मध्य 2012 (सितम्बर 2014), प्रलेखन कहते हैं:

डिफ़ॉल्ट रूप से, {{action}} सहायक टेम्पलेट के नियंत्रक पर एक विधि से चलाता है। [...] यदि नियंत्रक अपने क्रिया ऑब्जेक्ट में कार्रवाई के समान नाम के साथ एक विधि को लागू नहीं करता है, तो कार्रवाई राउटर को भेजी जाएगी, जहां वर्तमान में सक्रिय पत्ती मार्ग को कार्रवाई को संभालने का मौका दिया जाएगा । [...] यदि न तो टेम्पलेट का नियंत्रक और न ही वर्तमान में सक्रिय मार्ग एक हैंडलर लागू करता है, तो कार्रवाई किसी भी मूल मार्ग पर बबल जारी रहेगी। आखिरकार, यदि ApplicationRoute परिभाषित किया गया है, तो उसे कार्रवाई को संभालने का अवसर मिलेगा। जब कोई क्रिया ट्रिगर होती है, लेकिन नियंत्रक, वर्तमान मार्ग या वर्तमान मार्ग के पूर्वजों में से कोई भी मिलान करने वाला एक्शन हैंडलर लागू नहीं होता है, तो एक त्रुटि फेंक दी जाएगी।

+1

धन्यवाद। यहां कामकाजी समाधान है: http://jsfiddle.net/KvJ38/4/ – Lux

+1

दरअसल, किसी क्रिया का डिफ़ॉल्ट लक्ष्य युक्त नियंत्रक होता है, और फिर राउटर। यहां एक उदाहरण जेएसबीएन दिखा रहा है कि नियंत्रक कार्रवाई को संभालता है जब इसे नियंत्रक और मार्ग दोनों पर परिभाषित किया जाता है: http://emberjs.jsbin.com/tupil/3/edit। और यहां क्रियाओं के बारे में एम्बर दस्तावेज़ हैं: http://emberjs.com/guides/templates/actions/ – bantic

+0

दस्तावेज़ों से: "डिफ़ॉल्ट रूप से, {{action}} सहायक टेम्पलेट के नियंत्रक पर एक विधि ट्रिगर करता है" http://emberjs.com/guides/templates/actions/#toc_action-bubbling – fmendez

0

नियंत्रक कार्रवाई घटना के प्रभारी "सीधे" नहीं होना चाहिए। राज्य/मार्ग है।

मेरा मानना ​​है कि https://github.com/emberjs/ember.js/issues/1015 आपकी मदद करेगा।

+0

धन्यवाद। यह लिंक सहायक है! लेकिन, दृश्य के बारे में क्या? डिफ़ॉल्ट लक्ष्य क्यों नहीं देखते हैं? http://jsfiddle.net/KvJ38/9/ – Lux

4

आप अन्यथा कार्रवाई भेजने के लिए, @ स्टीफन द्वारा स्पष्ट रूप से लक्षित विशेषता निर्दिष्ट कर सकते हैं।

यदि निर्दिष्ट नहीं है, तो एक क्रिया सहायक का लक्ष्य नियंत्रक.target है। जैसा कि आपने देखा है, यह आमतौर पर राउटर पर सेट होता है।

यदि आपके पास एक टेम्पलेट है जहां आप डिफ़ॉल्ट लक्ष्य अलग करना चाहते हैं, तो आप नियंत्रक की लक्षित संपत्ति सेट करके ऐसा कर सकते हैं। उदाहरण के लिए, लक्ष्य को नियंत्रक को स्वयं सेट करने के लिए:

App.MyController = Ember.Controller.extend({ 
    init: function(){ 
    this._super(); 
    this.set('target', this); 
    }; 
}); 
+0

एक्शन हैंडलिंग के लिए भी बुलबुले के लिए, जबकि अनुक्रम कहता है ... वर्तमान नियंत्रक, फिर वर्तमान मार्ग और फिर अन्य सक्रिय मार्ग ... क्या इसका मतलब यह है कि माता-पिता के लिए, केवल मार्गों को संभालने का मौका मिलता है (और नियंत्रक नहीं। माता-पिता नियंत्रक)? – testndtv

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