2013-08-14 2 views
1

J'ai un routeur qui ressemble à ce que:Les meilleures pratiques avec des itinéraires profondes Ember avec Ember-données

App.Router.map -> 
    @resource 'categories', -> 
    @resource 'category', path: ':category_id', -> 
     @resource 'composites', -> 
     @resource 'composite', path: 'composite_id, -> 
      @resource 'questions', -> 
      #... 

Tous les itinéraires multiples ont un crochet de modèle charger tous les modèles en fonction du parent (sauf la ressource racine chargement de toutes les catégories). Comme crochet de modèle composites fera quelque chose comme App.Composite.find category_id: @modelFor('category').get('id').

Donc, cela fonctionne, mais la chose que je ne peux pas faire fonctionner parfaitement parfaitement après avoir essayé de nombreuses façons est la redirection automatique. Je veux qu'une fois les catégories chargées, rediriger vers la catégorie route en utilisant l'itinéraire firstObject chargé par catégories, puis rediriger vers la route composite, puis rediriger vers l'itinéraire composite avec firstObjevt chargé en route composites, etc. jusqu'au niveau final.

je l'ai fait travailler en partie à l'aide redirect, firstObjectObserver, ... mais je rencontre souvent un problème avec redirection infinie, ou ne pas avoir les modèles chargés avant d'essayer de rediriger vers la route suivante avec le premier modèle, ...

Quelle est la meilleure pratique pour le faire? Dois-je réécrire mon routeur d'une autre manière (je veux pouvoir avoir une URL pour chaque niveau même si, à la fin, elle se redirigera automatiquement jusqu'au dernier niveau, alors les modèles peuvent changer)? Comment dois-je attendre le chargement des modèles d'itinéraires multiples avant de les rediriger?

Répondre

3

Quelle est la meilleure pratique pour le faire? Dois-je réécrit mon routeur d'une autre manière

je recommande aplatir ces ressources - ne laissez pas la structure de l'URL dictera l'imbrication de la route, au lieu des ressources de nid en fonction de vos modèles et utiliser la propriété afin de spécifier la route/URL de ressource. Donc, à moins que votre interface utilisateur a vraiment une très profondément imbriqué modèle maître-détail avec des catégories, des composites et des questions, quelque chose comme cela serait plus logique:

App.Router.map -> 
    @resource 'categories' 
    @resource 'category', path: '/categories/:category_id', -> 
    @resource 'composites' 
    @resource 'composite', path: 'composites/:composite_id, -> 
     @resource 'questions' 
     #... 

Comment dois-je attendre les modèles de route plurielles à charger avant rediriger?

De toute façon, redirigeant devrait travail quelque chose comme ceci:

App.CategoriesRoute = Ember.Route.extend({ 
    model: function() { 
    return App.Category.find({}); 
    } 
}); 
App.CategoriesIndexRoute = Ember.Route.extend({ 
    redirect: function() { 
    var category = this.modelFor('categories').get('firstObject'); 
    this.transitionTo('category', category); 
    } 
}); 

Est-ce que cette approche ne fonctionne pas? Peut-être que cela fera l'affaire:

App.CategoriesIndexRoute = Ember.Route.extend({ 
    redirect: function() { 
    return App.Category.find({}).then(function(results) { 
     var category = results.get('firstObject'); 
     return this.transitionTo('category', category); 
    }); 
    } 
}); 
+0

Tout d'abord, merci pour votre réponse. – Huafu

+0

Sorry hit enter au lieu de SHIFT + ENTER Pour la première partie de la réponse, le fait est qu'une barre de navigation des catégories est montrée et ensuite une autre barre de navigation des composites pour cette catégorie, puis une liste de questions de ce composite ou les détails se rapportent à une question, donc je suppose principalement pour tout ce que j'ai besoin d'imbriquer plus pour avoir tous les modèles accessibles comme ça: 'categories' => sélectionné' category' => 'composites' de cette catégorie => sélectionné' composite' => 'questions' dans ce composite, sélectionné' question' – Huafu

+0

Pour la deuxième partie de la réponse, j'ai essayé votre approche mais la plupart du temps le 'this.modelFor ('categories')' n'a pas encore été chargé ou fini de charger, donc je ne pouvais pas obtenir le premier objet. Cela a fonctionné quand j'utilisais le crochet 'activate' du' XxxxIndexRotue' jusqu'à la dernière version de braise (RC6.1) où j'ai posté un bug pensait que c'était un et ils ont répondu que ce n'était pas la façon de le faire. Donc, voici la raison de ma question ici ;-) – Huafu

2

Ok, je pense que je l'ai compris. Je devais retourner une promesse dans la redirection de faire le tour pour les routes plurielles:

App.CategoriesIndexRoute = Em.Route.extend 
    redirect: (model, transition) -> 
    models = @modelFor('categories') 
    if (model = models.get 'firstObject') 
     @transitionTo 'category', model 
    else 
     promise = Em.Deferred.create() 
     observer = => 
     return unless (model = models.get 'firstObject') 
     models.removeObserver 'firstObject', observer 
     promise.resolve(@transitionTo 'category', model) 
     models.addObserver 'firstObject', observer 
     promise 

Et ce serait faire l'affaire. Je suis sûr qu'il y a une meilleure solution, je l'ai mis dans un mixin pour l'instant mais s'il vous plaît, si vous avez une meilleure solution, merci d'avance de me le faire savoir.

Questions connexes