在ember路线中同时准备两个模型

时间:2014-05-22 06:46:23

标签: ember.js model promise

我需要2个模型一起工作才能在网站上展示产品。 我有一个ProductController所以产品模型设置正确,因为我需要选项来显示产品,我需要在某处准备它(意味着在控制器运行之前解决承诺), 我认为setupController是正确的地方所以我设置了#39;选项'那里的财产,如下所示:

var Product = DS.Model.extend({
  name: DS.attr('string'),
  price: DS.attr('number'),
  img: DS.attr('array')
});

var Option = DS.Model.extend({
  productId: DS.attr('number'),
  drawType: DS.attr('string'),
  background: DS.attr('string'),
  positionX: DS.attr('number'),
  positionY: DS.attr('number')
});

 App.ProductRoute =  Ember.Route.extend({
   setupController: function(controller, model) {
    controller.set('model', model);
    // i want to prepare option well so controller can get real data 
    // instead of a promise 
    this.store.find('option', 0).then(function(data){
      controller.set('option', data);
    });
  })
})

App.ProductController =  Ember.ObjectController.extend({
  init: function(){
    this._super();
    console.log('can i get option in init?:', this.get('option'));
  }
})

但它不能按我的预期工作,productController init中的输出是未定义的。任何人都可以帮忙,我哪里错了?感谢。

1 个答案:

答案 0 :(得分:0)

一个想法是使用afterModel hook来获取您的选项对象并将其设置为路线上的属性。然后在setupController中,您也可以在控制器上设置该对象。

App.ProductRoute = Ember.Route.extend({
  option: null,

  afterModel: function() {
    var _this = this;
    return this.store.find('option', 0).then(function(data) {
      _this.set('option', data);
    });
  },

  setupController: function(controller, model) {
    controller.set('model', model);
    controller.set('option', this.get('option'));
  }
});

但是,我不认为您可以在控制器的init()函数中访问选项对象(甚至是模型),因为在init()之后调用了setupController()。

附注 - 您可能希望将选项中的字段productId: DS.attr('number')替换为product: DS.belongsTo('product')