2016-05-12 1 views
1

У меня есть маршрут под названием tickets, который имеет это модель установки, как такНевозможно вызвать Foreach на модели хэш в контроллере

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

Вы вероятно хотите использовать '@ each' вместо' [] 'в зависимой собственности , 'model.tickets. @ each.ticket_purchase_code' – Kingpin2k

ответ

2

Попробуйте обороняясь от model.tickets итерируемая над, с чем-то вроде этого в вычисленной собственности:

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

Вам не нужно обертывать' [] 'в' Ember.Array', Ember по умолчанию расширяет Array для реализации 'Ember.Enumerable',' Ember.MutableEnumerable', 'Ember.MutableEnumerable', Ember.MutableArray' и 'Ember.Array'. https://guides.emberjs.com/v1.10.0/configuring-ember/disabling-prototype-extensions/ – Kingpin2k

+0

Ссылка на новую версию Ember для прототипа: https://guides.emberjs.com/v2.5.0/configuring-ember/ disabling-prototype-extensions/ – Kingpin2k

0

this.controller.get('model.length') всегда нуль, поскольку модель является хэш , а не массив. Также 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

'didTransition' - это событие и относится к хэшам действий. http://emberjs.com/api/classes/Ember.Route.html#event_didTransition. Остальные - «активировать», «деактивировать», «ошибка», «загрузка», «willTransition» – Kingpin2k

Смежные вопросы