2013-02-26 4 views
14

Ich habe einen Router eingerichtet mit Konten und Konto /: account_id Optionen. Wenn der Nutzer auf der Indexseite meiner App landet, übertrage ich ihn auf die Kontenroute.Ember.js: Übergang zu Route, dann zu dynamischen Segment

Was ich tun möchte, ist es, sie auf eine bestimmte: account_id Route basierend auf einigen Kriterien zu überführen. Im Moment möchte ich nur das erste Konto im Array bekommen und das verwenden. Aber in Zukunft könnte es ein Weg sein, sie zu dem letzten Konto, das sie sich angesehen haben, zu überführen. Etwas wie folgt aus:

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

Die docs geben "Detail" aber ein Beispiel, das nicht bieten, nur bietet die folgenden:

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.

Ich habe folgendes versucht:

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 

Antwort

13

ich zusammen Antworten andere und etwas Fummelei und kam mit dieser Antwort aus:

definieren Sie Ihre Routen wie:

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

Umleitung:

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

Aber Wenn Sie vom Server laden, müssen Sie das accountObj Objekt laden b efore Umleitung:

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

stelle ich this fiddle mit komplettem Beispiel bis

+0

Ihre Geige schien nicht zu funktionieren, also habe ich sie mit Calls von CDNjs.com aktualisiert: http://jsfiddle.net/XNyme/9/ – commadelimited

2

Es scheint, dass transitionTo zugunsten von transitionToRoute veraltet ist.

Trotzdem können Sie die Umleitung erreichen, indem Sie die ursprüngliche Deklaration this.resource('account', { path: '/:account_id'}); haben und dann die Transition mit dem einzelnen erstellten Objekt funktionieren sollte.

2

Sie geben den Routenpfad nicht richtig an und Sie sollten eine Route unter der Ressource haben, keine andere Ressource. Es sollte so sein:

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

Okay.Die Implementierung dieses Codes bringt mir zwei Dinge. 1) Die URL ändert sich wie erwartet. 2) Ich bekomme einen Konsolenfehler von 'Uncaught Error: Assertion failed: Das Routenkonto wurde nicht gefunden. Wenn ich auf '/' lande, ändert sich die URL zu '/ #/accounts/1', was ich erwarten würde, aber nichts lädt und der Konsolenfehler erscheint. – commadelimited

+0

Ich habe vergessen, einen Pfad zur Root-Accounts-Ressource hinzuzufügen. – buuda

0

Da Ihre /: account_id eine Ressource ist, müssen Sie transitionToRoute "account". Sie benötigen auch eine AccountRoute entsprechend.

Wenn /: account_id eine Route war, keine Ressource, würden Sie transitionToRoute 'accounts.account' und Ihre Route-Handler würde AccountsAccountRoute genannt werden.

1

Mit neuesten Ember (1.0.0-RC-6), das perfekt funktioniert.

Router:

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

So zu leiten:

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

Es funktioniert einfach mit ember 1.1.3 + pre.e0ffbf84. Vielen Dank. – hiroshi

Verwandte Themen