2013-02-17 10 views
6

मैं दो संसाधनों दोनों एक ही उप-संसाधन है कि है:मैं ember.js में नेस्टेड मार्गों को कैसे बांट सकता हूं?

App.Router.map(function() { 
    this.resource('post', function() { 
    this.resource('comments', function() { 
     this.route('new'); 
    }); 
    }); 

    this.resource('product', function() { 
    this.resource('comments', function() { 
     this.route('new'); 
    }); 
    }); 
}); 

समस्या यह है कि एंबर रूटर सिर्फ वर्तमान और माता पिता के मार्गों से बाहर मार्ग वस्तुओं के नाम बनाता है, न कि पूरी से बाहर है पदानुक्रम। इस प्रकार, यह और /products/:id/comments/new दोनों App.NewCommentRoute ऑब्जेक्ट को रूट करने का प्रयास करता है। मुझे इसे ठीक करने के लिए क्या करना चाहिए?

यह पोस्ट GitHub issue से अनुकूलित किया गया था।

+0

यह मूल रूप से मेरे सवाल था: https://github.com/emberjs/ember.js/issues/2086 एक छोटे से मेरी प्रतिनिधि की तरह सिकी की जा रही है Feels। – KOGI

+0

इसके बारे में क्षमा करें। मैंने इसे नहीं देखा। मैं अपना जवाब समुदाय विकी के रूप में चिह्नित करूंगा। (प्रश्न नहीं हो सकते हैं, हालांकि मैंने प्रश्न पाठ में आपके गिटहब मुद्दे से लिंक किया है।) –

+0

धन्यवाद। आपका जवाब आपका सब कुछ है, हालांकि, आपको इसके लिए सभी प्रतिनिधि मिलना चाहिए। केवल मूल प्रश्न मेरा था। – KOGI

उत्तर

6

मैंने जेम्स ए रोसेन के समाधान को एक कदम आगे ले लिया और यह एक आकर्षण की तरह काम करता था। अनावश्यक थोड़ा है, लेकिन चीजों को और अधिक सहज ज्ञान युक्त सड़क के नीचे बना देता है:

App.Router.map(function() { 
    this.resource('post', function() { 
    this.resource('post.comments', { path: '/comments' }, function() { 
     this.route('new'); 
    }); 
    }); 

    this.resource('product', function() { 
    this.resource('product.comments', { path: '/comments' }, function() { 
     this.route('new'); 
    }); 
    }); 
}); 

यह अब आप उपयोग करना transitionTo('product.comments.new') या App.register('route:product.comments.new', myRouteHandler) बस के रूप में मूल रूप से उम्मीद की अनुमति देता है।

यदि आप स्वयं अपनी मार्ग हैंडलर रजिस्टर नहीं है, एंबर, शान से, यहां तक ​​कि इसके लिए App.ProductCommentsNewRoute

केवल नकारात्मक पक्ष में दिखेगा एक ही रूट नाम के साथ उप-संसाधन के नाम को परिभाषित करने के अतिरेक है कि मूल संसाधन पहले से ही है।

4

जब आप कोई मार्ग निर्दिष्ट करते हैं, तो पथ मार्ग के नाम पर डिफ़ॉल्ट होता है, लेकिन आप उस व्यवहार को ओवरराइड कर सकते हैं। आप नाम पर अधिक जानकारी जोड़कर गहरे घोंसले मार्गों को अलग कर सकते हैं।

App.Router.map(function() { 
    this.resource('post', function() { 
    this.resource('postComments', { path: '/comments' }, function() { 
     this.route('new'); 
    }); 
    }); 

    this.resource('product', function() { 
    this.resource('productComments', { path: '/comments' }, function() { 
     this.route('new'); 
    }); 
    }); 
}); 
App.Router.map(function() { 
    this.resource('post', function() { 
    this.resource('comments', function() { 
     this.route('newPost', { path: '/new' }); 
    }); 
    }); 

    this.resource('product', function() { 
    this.resource('comments', function() { 
     this.route('newPost', { path: '/new' }); 
    }); 
    }); 
}); 

दोनों ही मामलों में, रूटर अब App.NewPostCommentsPath और App.NewProductCommentsPath के लिए दिखेगा: वहाँ मूलतः एक ही परिणाम प्राप्त करने के लिए दो तरीके हैं। दूसरे से पहले का लाभ यह है कि यदि आप बाहरी रूप से मार्गों का संदर्भ लेना चाहते हैं, तो वे "comments.newPost" के बजाय "postComments.new" की तरह दिखते हैं। पूर्व मेरे लिए बेहतर पढ़ता है।

+0

+1 इसके लिए धन्यवाद। यह एक प्रभावी कामकाज है। हालांकि, जैसा कि गिटहब पर मूल धागे में बताया गया है, यह वास्तव में एक उचित समाधान नहीं है कि एम्बर टीम से संतुष्ट होना चाहिए। – KOGI

1

दो साल बीत चुके हैं, एम्बर ने काफी सुधार किया है।

एम्बर 1.7 के बाद से, मार्गों में subroutes भी हो सकते हैं: http://emberjs.com/blog/2014/08/23/ember-1-7-0-released.html#toc_new-features

तो हम के रूप में इस पुनर्लेखन कर सकते हैं:

this.route('post', function() { 
    this.route('comments', { path: '/comments' }, function() { 
     this.route('new'); 
    }); 
}); 

this.route('product', function() { 
    this.route('comments', { path: '/comments' }, function() { 
     this.route('new'); 
    }); 
}); 
संबंधित मुद्दे

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