web-dev-qa-db-fra.com

Comment accéder à un modèle parent dans une route d'index imbriquée en utilisant ember.js?

J'ai la structure d'itinéraire suivante

App.Router.map(function(match) {
    this.route("days", { path: "/" });
    this.resource("day", { path: "/:day_id" }, function() {
        this.resource("appointment", { path: "/appointment" }, function() {
            this.route("edit", { path: "/edit" });
        });
    });
});

Lorsque je suis à l'intérieur du AppointmentIndexRoute, je cherche un moyen de créer un nouveau modèle en utilisant une méta-journée du modèle day (parent) mais parce que le modèle day ne connaît pas encore ce rendez-vous, je ne sais pas comment les associer jusqu'à ce que le rendez-vous soit créé/et que le commit soit déclenché.

Toute aide serait très appréciée

38
Toran Billups

Depuis le hook de modèle de AppointmentIndexRoute, vous pouvez utiliser modelFor ('day') pour accéder au modèle parent. Par exemple:

App.AppointmentIndexRoute = Ember.Route.extend({
  model: function(params) {
    day = this.modelFor("day");
    ...
  }
});

Un autre exemple est ici: emberjs 1.0.0pre4 comment passez-vous un objet de contexte à une route "... Index" de ressource?

43
Mike Grassotti

Que faire si je n'utilise pas de données ember? Comment puis-je obtenir l'ID parent dans un itinéraire comme

  this.resource('workspace',function () {
    this.resource('workflow', {path: '/:workspace_id/workflow'}, function () {
      this.route('show', {path: '/:workflow_id'});
    });
  });

Ce code ne fonctionnera pas:

App.WorkflowShowRoute = Em.Route.extend({
  model: function(params) {
      var ws  = this.modelFor('workspace');  //ws is undefined
      return this.store.find('workflow', params.id, ws.id);
  }
});

EDIT: J'ai trouvé une solution de contournement, ce n'est pas idéal mais fonctionne exactement comme je le veux.

  this.resource('workspace',function () {
    this.route('new');
    this.route('show', {path: '/:workspace_id'});
    //workflow routes
    this.resource('workflow', {path: '/'}, function () {
      this.route('new', {path:'/:workspace_id/workflow/new'});
      this.route('show', {path: '/:workspace_id/workflow/:workflow_id'});
    });
  });

Et dans mon itinéraire de flux de travail, je peux accéder au jus workspace_id comme je l'attends de la propriété params:

App.WorkflowShowRoute = Em.Route.extend({
  model: function(params) {
      return this.store.find('workflow', params.workflow_id, params.workspace_id);
  }
});

Enfin, voici mon lien vers l'intérieur de l'assistant de route workspace.show:

{{#each workflow in workflows}}
  <li>
    {{#link-to 'workflow.show' this.id workflow.id}}{{workflow.name}}{{/link-to}}
  </li>
{{/each}}
3
Emad