模型ID来自另一个模型,我如何通过ember设置路径

时间:2017-01-19 08:48:01

标签: ember.js ember-data

我的余烬版本:

DEBUG: -------------------------------
Ember             : 2.10.2
Ember Data        : 2.11.0
jQuery            : 2.2.4
Ember Simple Auth : 1.1.0
Model Fragments   : 2.3.2
DEBUG: -------------------------------

我的路线代码:

import Ember from 'ember';
import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin';
import RSVP from 'rsvp';

export default Ember.Route.extend(AuthenticatedRouteMixin, {
  model() {
    console.log(1);
    return RSVP.hash({
      ...,
      user: this.store.findRecord('user', this.get('session.data.authenticated.id'))
    });
  },

  afterModel(model, transition) {
    return this.store.findRecord('company', model.user.get('companyId')).then(company => {
      console.log(2);
      this.set('company', company);
    });
  },

  setupController(controller, model) {
    console.log(3);
    controller.set('user', model.user);
    controller.set('company', this.get('company'));
  }
});

查看console.log代码,我认为正确的顺序应为1-> 2> 3。但有时结果是1-> 3-> 2。

但我的company id必须来自user api。那么我在路线上设置的方式是什么?感谢。

2 个答案:

答案 0 :(得分:2)

我正在编写另一种解决方案,来自RSVP.hash api docs

  

返回在履行了所有给定承诺时履行的承诺,或者如果其中任何承诺被拒绝则拒绝承诺。使用与promises对象参数具有相同键名的哈希来实现返回的promise。如果对象中的任何值不是promises,它们将被简单地复制到已完成的对象。

所以你可以写下你的要求,如下面的代码,

model() {
        var promises = {
            user: this.store.findRecord('user', this.get('session.data.authenticated.id'))
        };
        return Ember.RSVP.hash(promises).then(hash => {
            //then method will be called once all given promises are fulfilled, or rejected if any of them become rejected.
            return this.store.findRecord('company', hash.user.get('companyId')).then(company => {
                hash.company = company; // Here i am setting company property inside model itself, so you dont need to set it in route and carry over to controller
                return hash;
            });
        })
    }

注意:我很想知道你是否可以在ember-twiddle中重现1-> 3> 2行为。

答案 1 :(得分:2)

实际上,正确的方法是将所有模型提取放在model钩子中:

model() {
  return RSVP.hash({
    ...,
    user: this.store.findRecord('user', this.get('session.data.authenticated.id'))
  }).then(hash => {
      hash.company = this.store.findRecord('company', hash.user.get('companyId'));
      return RSVP.hash(hash);
  })
},

setupController(controller, model) {
  controller.set('user', model.user);
  controller.set('company', model.company);
}