2013-03-19 5 views
16

Ember.Route.model पर params चर का उपयोग है, लेकिन Ember.Route.setupController नहीं है। यह मेरे लिए परेशानी है, क्योंकि मेरे पथ में कई गतिशील खंड हैं, और मुझे अपने टेम्पलेट में उन सभी का उपयोग करने की आवश्यकता है।Ember.Route के भीतर से पैरामीटर तक पहुंचने का सही तरीका क्या है। setupController?

विशेष रूप से, मेरा पथ इस तरह दिखता है: /project/:project_id/task/:task_id। ध्यान दें कि एक कार्य कई परियोजनाओं से संबंधित हो सकता है, सिर्फ एक ही नहीं। इसलिए हम यह नहीं बता सकते कि हम जिस परियोजना को देख रहे हैं, वह केवल कार्य को देख रहे हैं: हमें यूआरएल में मिली परियोजना आईडी का उपयोग करना होगा। यह सिर्फ hacky लगता है

App.TaskRoute = Ember.Route.extend({ 

    // This works just fine: 
    serialize: function(model) { 
    return { 
     task_id: model.get('id'), 
     project_id: this.modelFor('project').get('id') 
    }; 
    }, 

    model: function(params) { 
    this.set('parentProjectId', params.project_id); 

    return App.Task.find(params.task_id); 
    }, 

    setupController: function(controller, model) { 
    var parentProject = this.modelFor('project') ? 
         this.modelFor('project') : 
         App.Project.find(this.get('parentProjectId')); 
    controller.set('parentProject', parentProject); 

    controller.set('content', model); 
    } 
}); 

शायद मैं पागल जा रहा हूँ, यहाँ मैं इसे कैसे वर्तमान में कर रहा हूँ है। यदि मार्ग पैरामीटर तक पहुंच के लिए था, तो उसके पास पहले से params संपत्ति संलग्न होगी। क्या कोई बेहतर तरीका है?

संपादित करें: मैंने उपरोक्त कोड में कुछ अपडेट किया है। इसके अलावा, मेरे मार्ग इस तरह दिखते हैं:

App.Router.map(function() { 
    this.resource('project', { path: '/project/:project_id' }); 
    this.resource('task', { path: 'project/:project_id/task/:task_id' }); 
}); 

उत्तर

10

आपके पास सेटअप नियंत्रक हुक में इन पैराम तक कोई पहुंच नहीं है। मॉडल हुक के पास पैराम ऑब्जेक्ट तक पहुंच है, क्योंकि इसे केवल यूआरएल के माध्यम से दर्ज किया जाता है, क्योंकि इसे केवल कॉल किया जाता है।

आपका कोड काफी ठीक दिखता है, आप वास्तव में जानते हैं, कि आप इसे इस तरह से करना चाहते हैं। इसके बारे में आपको हैकी महसूस करता है? इस कोड को देखते समय, मैं खुद से पूछ रहा हूं कि आपने अपने रूट के तर्क को प्रोजेक्ट रूट और एक अधीनस्थ टास्क रूट में क्यों विभाजित नहीं किया है। क्या यह आपके लिए काम नहीं करेगा?

अद्यतन:

App.Router.map(function() { 
    this.resource('project', { path: '/project/:project_id' }, function(){ 
    this.resource('task', { path: '/task/:task_id' }); 
    }); 
}); 

के बाद से TaskRoute नहीं नीडिंत है आप ProjectTaskRoute को यह नाम बदलने के लिए है: अपने परिवर्तनों को

नेस्टिंग संसाधनों के जवाब की संभावना अपने मामले में सफलता की कुंजी है

App.ProjectTaskRoute = Ember.Route.extend({ 
... 
}); 

यह आपको मार्ग से parentProjectId property को हटाने में सक्षम होना चाहिए।

+0

आह, मुझे पता नहीं था कि मॉडल विधि को केवल पहले लोड पर ही बुलाया जाता है, लेकिन यह मुझे देख रहा है कि बहुत सी quirkiness बताता है। उदाहरण के लिए, उपरोक्त मेरा कोड काम नहीं करता है अगर मैं सीधे/प्रोजेक्ट/1/कार्य/2 खोलता हूं, क्योंकि 'मॉडल' नहीं कहा जाता है, इसलिए' parentProjectId' विशेषता सेट नहीं होती है। उस स्थिति में, मुझे 'var parentProject = this.modelFor ('project')' setupController 'के अंदर' करना होगा। मेरे पास एक अलग प्रोजेक्ट रूट है। ओपनिंग/प्रोजेक्ट/1 एक परियोजना के लिए कार्य दिखाएगा। किसी कार्य पर क्लिक करने से/प्रोजेक्ट/1/कार्य/1 खुल जाएगा। कार्य दृश्य को परियोजना के लिए एक लिंक की आवश्यकता है, इसलिए मैं यूआरएल से परियोजना खींच रहा हूं। – NudeCanalTroll

+0

तो यह अब काम करता है? मेरा विचार यह भी इस्तेमाल करना था। ModelFor ("प्रोजेक्ट")। जब आप अपना ऐप/प्रोजेक्ट/1/कार्य/2 के माध्यम से दर्ज करते हैं, तो प्रोजेक्ट रूट पहले और उसके मॉडल हुक को मारा जाना चाहिए। इसके बाद आप इसे एक्सेस करने के लिए मॉडलफोर का उपयोग कर सकते हैं। जब आप अपने डेटा को मॉडल करने के लिए एम्बर-डेटा का उपयोग करते हैं, तो यह आपके नियंत्रक में पैरेंटप्रोजेक्ट को सेट करने के लिए केवल थोड़ी सी अनावश्यक महसूस करता है। आपके टास्कमोडेल पर उस संपत्ति का अस्तित्व नहीं होना चाहिए? – mavilein

+0

एक कार्य कई परियोजनाओं (टैग जैसे परियोजनाओं के बारे में सोचें) से संबंधित हो सकता है, इसलिए "प्रोजेक्ट से संबंधित" एसोसिएशन होने की बजाय यह "कई परियोजनाएं" एसोसिएशन है। इस प्रकार, मैं यह नहीं बता सकता कि मैं किस परियोजना के अंदर हूं (और इस प्रकार जहां बैक बटन को लिंक करना चाहिए) बस कार्य को देखकर। मुझे यूआरएल जांचना है। वैसे भी, मैं मॉडल के लिए मॉडल की कोशिश करूंगा। मुझे लगता है कि मेरे मार्गों को गलत तरीके से स्थापित किया गया है, इसलिए/प्रोजेक्ट/1/टास्क/2 पर जाकर पहले टास्क रूट को मार रहा है।मुझे लगता है कि मुझे अपने परियोजना मार्गों के अंदर अपने कार्य मार्गों को घोंसला करने की ज़रूरत है? मैं यह दिखाने के लिए अपना प्रश्न अपडेट करूंगा कि मेरे मार्ग कैसा दिखते हैं। – NudeCanalTroll

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