У меня есть маршрут под названием tickets, модель которого настроена так

model() {
  return Ember.RSVP.hash({
    event: null,
    tickets: null
  });
},
actions: {
  didTransition(){
    if(!this.controller.get('model.length')){
      new Ember.RSVP.hash({
        event: this.modelFor('events.event'),
        tickets: this.store.query('ticket',{user_id:this.get('user.user.user_id'),event_code:this.modelFor('events.event').get('event_code')})
      }).then((hash)=>{
        if(!hash.tickets.get('length')){
          this.controller.set('noTickets',true);
        }
        this.controller.set('model',hash);
      });
    }
  }
}

Шаблону удается перебрать эти model.tickets в блоке {{#each}}.

В моем контроллере я пытаюсь настроить вычисленный groupBy, но в моем вычисленном я получаю ошибку

ticketsByPurchase: Ember.computed('model.tickets.[].ticket_purchase_code',function(){
    let tickets = this.get('model.tickets');
    tickets.forEach(function(ticket){
      console.log(ticket);
    });
  })
1
Jordan 12 Май 2016 в 22:53

2 ответа

Лучший ответ

Попробуйте защититься от итерации model.tickets, используя в свойстве computed что-то вроде этого:

if(!tickets){
  return Ember.A()
}else{
  //your forEach code here
}

Или это в вашем маршруте:

  }).then((hash)=>{
    if(!hash.tickets.get('length')){
      this.controller.set('noTickets',true);
      hash.tickets = Ember.Array([])
      this.controller.set('model',hash);
    }else{
      this.controller.set('model',hash);
    }
  });
2
TameBadger 12 Май 2016 в 20:09

this.controller.get('model.length') всегда имеет значение NULL, потому что модель - это хэш, а не массив. Также didTransition не является действием, это обычная функция, поэтому она, вероятно, не сработает, если определена в хэше действий.

Я бы рекомендовал удалить вызов didTransition и выполнить всю логику в вашем крючке модели следующим образом:

model() {
  let event = this.modelFor('events.event');
  let event_code = event.get('event_code');

  // this probably does not work, you have to get the user
  // from another route or a service.
  // this might work: this.controllerFor('user').get('user.user_id');
  let user_id = this.get('user.user.user_id');

  return Ember.RSVP.hash({
    event,
    tickets: this.store.query('ticket', { user_id, event_code })
  });
},

setupController(controller, model) {
  // super sets controller model to be route model.
  // ie. controller.set('model', model);
  this._super(...arguments);

  if (!model.get('tickets.length')) {
    controller.set('noTickets', true);
  }
}
0
Isaac 12 Май 2016 в 21:18