utils ember component addons ember.js ember-data ember-router

ember.js - component - service ember



¿Cuál es la forma correcta de acceder a los parámetros desde Ember.Route? setupController? (2)

Ember.Route.model tiene acceso a la variable params , pero Ember.Route.setupController no lo tiene. Esto es problemático para mí, porque mi ruta tiene varios segmentos dinámicos y necesito usarlos todos en mi plantilla.

Específicamente, mi ruta se ve así: /project/:project_id/task/:task_id . Tenga en cuenta que una tarea puede pertenecer a muchos proyectos, no solo a uno. Por lo tanto, no podemos decir qué proyecto estamos viendo, solo mirando la tarea en sí: tenemos que usar el ID del proyecto que se encuentra en la URL. Así es como lo estoy haciendo actualmente:

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); } });

Tal vez estoy siendo paranoico, esto simplemente se siente raro. Si la ruta estaba destinada a tener acceso a los parámetros, entonces ya tendría una propiedad params adjunta. ¿Hay alguna manera mejor?

EDITAR: He hecho alguna actualización al código anterior. Además, mis rutas se ven así:

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


Desde Ember 1.8, la clase Route tiene una función paramsFor :

import Route from ''@ember/routing/route''; export default Route.extend({ setupController(controller) { this._super(...arguments); const params = this.paramsFor(''name.of.your.route'') } });


No tiene acceso a estos parámetros en el enlace setupController. El modelo enganche tiene acceso a un objeto params, porque solo se le llama, cuando su aplicación se ingresa a través de una URL.

Tu código se ve muy bien, realmente sabes que quieres hacerlo de esta manera. ¿Qué te hace sentir mal al respecto? Al mirar este código, me pregunto por qué no dividió la lógica de su Ruta en un ProjectRoute y un TaskRoute subordinado. ¿No te funcionaría?

Actualización: Respuesta a tus cambios.

Los recursos de anidación es probablemente la clave del éxito en su caso:

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

Como el TaskRoute está anidado, no es necesario cambiarle el nombre a ProjectTaskRoute

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

Esto debería permitirle eliminar la parentProjectId property de la Ruta.