2015-08-13 2 views
2

Я пытаюсь сделать следующее при посещении обзоры/шоу (/reviews/:id):синхронные вызовы данных в ember.js

  • нагрузки две модели с сервера: один review и один user.
  • Я только иметь доступ к И.Д. review «s, так что мне нужно, чтобы загрузить его первым, чтобы получить userId
  • И затем, когда тот закончил погрузку и теперь у меня есть userId, запросить user с помощью userId приписывать от review
  • Наконец, возвращение оба эти в хэш, так что я могу использовать их как в шаблоне

так два синхронных запросов к базе данных, а затем вернуть их обоих сразу в model крюком маршрут.

Я не против, если он медленный, это достаточно быстро, и мне нужно его работать сейчас.

Это то, что я пытался, и это не работает:

обзоры/show.js

export default Ember.Route.extend({ 
    model: function(params) { 
    var user; 
    var review = this.store.findRecord('review', params.id).then(
     function(result) { 
     user = this.store.findRecord('user', result.get('userId')); 
     } 
    ); 

    return Ember.RSVP.hash({ 
     review: review, 
     user: user 
    }); 
    } 
}); 
+0

Кстати, вы делаете ** прикованные ** вызовы данных. Синхронный ajax вызывает блокировку javascript от выполнения чего-либо. –

ответ

7

Вы можете сделать это:

export default Ember.Route.extend({ 
    model: function(params) { 
    var reviewPromise = this.store.findRecord('review', params.id); 
    return Ember.RSVP.hash({ 
     review: reviewPromise, 
     user: reviewPromise.then(review => { 
     return this.store.findRecord('user', review.get('userId')); 
     }) 
    }); 
    } 
}); 

причина, почему пользователь это undefined, потому что он не был назначен в вашем первом обещании до тех пор, пока обзор не будет разрешен, но Ember.RSVP.hash получил user как undefined.

+0

Эй, Kit. Спасибо за Ваш ответ. Когда вы запускаете код точно так же, как вы опубликовали, он дает ошибку 'can not read property 'store' undefined' .. потому что контекст' this' изменяется внутри обещания. Его можно устранить, сохранив 'this' в переменной внутри области' model() '. Но у вас была правильная идея. Я отредактировал ответ так, чтобы у него был рабочий код (PS я только редактировал ваши комментарии о том, чтобы быть красивым, поэтому у меня было бы как минимум 10 символов в моем редактировании, извините haha) –

+0

@MarcoPrins Контекст не изменяется, когда вы используете функцию стрелки , Удостоверьтесь, что вы не набрали 'function' –

+0

, это интересно. Это вещь ES6? –

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