2013-02-26 109 views
14

मेरे पास राउटर खातों के साथ स्थापित है, और खाता /: account_id विकल्प हैं। जब उपयोगकर्ता मेरे ऐप के इंडेक्स पेज पर उतरता है तो मैं उन्हें खाता रूट में बदल देता हूं।एम्बर.जेएस: संक्रमण मार्ग के लिए, फिर गतिशील सेगमेंट

Social.Router.map(function() { 
    this.resource('accounts', function(){ 
     this.resource('account', { path: ':account_id'}); 
    }); 
}); 

Social.IndexRoute = Ember.Route.extend({ 
    redirect: function() { 
     this.transitionTo('accounts'); 
    } 
}); 

मैं क्या करना चाहता हूं उन्हें कुछ मानदंडों के आधार पर निर्दिष्ट: account_id मार्ग में स्थानांतरित करना है। फिलहाल मैं सरणी में पहला खाता प्राप्त करना चाहता हूं और इसका उपयोग करना चाहता हूं। लेकिन भविष्य में वे उन्हें देख रहे अंतिम खाते में स्थानांतरित करने का एक तरीका हो सकते हैं। कुछ इस तरह:

Social.IndexRoute = Ember.Route.extend({ 
    redirect: function() { 
     this.transitionTo('accounts/:account_id'); 
    } 
}); 

डॉक्स "विस्तार" दे लेकिन एक उदाहरण प्रदान नहीं करते, केवल की पेशकश निम्नलिखित:

transitionTo (name, models)

Transition into another route. Optionally supply a model for the route in question. The model will be serialized into the URL using the serialize hook.

मैं कोशिश की है निम्नलिखित:

this.transitionTo('accounts/4'); 
Uncaught Error: assertion failed: The route accounts/4 was not found 

this.transitionTo('accounts', Social.Account.find(1)); 
Uncaught More objects were passed than dynamic segments 

उत्तर

13

मैं एक साथ दूसरों के उत्तरों की और कुछ नगण्य कर दिया है और इस जवाब के साथ बाहर आया था: की तरह अपने मार्गों को परिभाषित

:

this.resource('accounts', function() { 
    this.route('account', {path: '/:account_id'}); 
}); 

पुन: निर्देश:

this.transitionTo('accounts.account', accountObj); 

लेकिन अगर आप सर्वर से लोड हो रहे हैं, तो आपको accountObj ऑब्जेक्ट लोड बी की आवश्यकता है efore पुन: निर्देश:

var accountObj = App.Account.find(1); 
accountObj.one('didLoad', this, function() { 
    this.transitionTo('accounts.account', accountObj); 
}); 

मैं पूर्ण उदाहरण

+0

आपका बेवकूफ काम नहीं कर रहा था इसलिए मैंने इसे CDNjs.com से कॉल के साथ अपडेट किया: http://jsfiddle.net/XNyme/9/ – commadelimited

2

यह संक्रमण की तरह दिखता है संक्रमण के पक्ष में बहिष्कृत किया गया है।

फिर भी आप मूल घोषणा this.resource('account', { path: '/:account_id'}); होने के बाद रीरेट प्राप्त कर सकते हैं और फिर एकल निर्मित ऑब्जेक्ट के साथ संक्रमण कार्य करना चाहिए।

2

आप मार्ग मार्ग को सही तरीके से निर्दिष्ट नहीं कर रहे हैं और आपके पास संसाधन के तहत एक मार्ग होना चाहिए, न कि अन्य संसाधन। यह इस तरह से होना चाहिए:

Social.Router.map(function() { 
    this.resource('accounts', function(){ 
     this.route('account', { path: '/:account_id'}); 
    }); 
}); 

Social.IndexRoute = Ember.Route.extend({ 
    redirect: function() { 
     this.transitionTo('accounts.account', Social.Account.find(1)); 
    } 
}); 
+0

ठीक है।इस कोड को लागू करने से मुझे दो चीजें मिलती हैं। 1) यूआरएल अपेक्षित के रूप में बदलता है। 2) मुझे 'असीमित त्रुटि' का कंसोल त्रुटि मिल रही है: दावा विफल: मार्ग खाता नहीं मिला था। जब मैं '/' पर यूआरएल बदलता हूं तो यूआरएल '/ #/accounts/1' में बदल जाता है, जो मैं अपेक्षा करता हूं, लेकिन कुछ भी लोड नहीं होता है और कंसोल त्रुटि प्रकट होती है। – commadelimited

+0

मैं रूट खातों संसाधन के लिए पथ जोड़ने के लिए भूल गया। – buuda

0

के रूप में अपने /: ACCOUNT_ID एक संसाधन आप transitionToRoute 'खाते' की जरूरत है। आपको तदनुसार खाता रूट की भी आवश्यकता है।

यदि /: खाता_आईडी एक ऐसा मार्ग था जो संसाधन नहीं था, तो आप ट्रांज़ेक्शन 'accounts.account' और आपके रूट हैंडलर को अकाउंट अकाउंट रूट कहा जाएगा।

1
नवीनतम एंबर (1.0.0-आर सी -6), इस पूरी तरह से काम करता है के साथ

साथ this fiddle की स्थापना की।

रूटर:

this.resource('accounts', function() { 
    this.resource('account', {path: '/:account_id'}); 
}); 

अनुप्रेषित करने के लिए:

this.transitionToRoute('account', Social.Account.find(1)) 
+0

यह सिर्फ एम्बर 1.1.3 + pre.e0ffbf84 के साथ काम करता है। धन्यवाद। – hiroshi