Ember没有调用路由器的setupController

时间:2017-07-03 18:12:41

标签: javascript ember.js ember-data

所以,我的路线有两条路。我创建了两条路线doc recommends

我的路由器如下:

// router.js
Router.map(function() {
  this.route('photos');
  this.route('photo', { path: '/photo/:photo_id' });
});

如果我首先访问路线/照片/ ID然后转到/照片,它将只显示后者的一个对象。 (的

如果我首先访问/照片它会显示所有对象,我可以稍后转到/ photo / ID,这样会很好。 (正确

我想让它在两个方面都有效。这该怎么做?您可以在下面看到我的代码:

// photo.js
export default Ember.Route.extend({
  model(params) {
    return this.get('store').findRecord('photo', params.photo_id);
  }
});

// photos.js
export default Ember.Route.extend({
  setupController(controller, model) {
    let photos = this.get('store').findAll('photo');
    console.log('add all...');
    // convert to an array so I can modify it later
    photos.then(()=> {
      controller.set('photos', photos.toArray());
    });
  },
});

无论用户去哪里,我都可以随时拨打findAll()功能,但我不认为这很聪明。

我处理页面转换的方式:

要使用我使用的照片:

{{#link-to 'photos'}}All{{/link-to}}

转到/ photo / ID我注入服务' -routing'我在一个事件中使用点击这样:

routing: Ember.inject.service('-routing'),
actions() {
    selectRow(row) {
        this.get("routing").transitionTo('photo', [row.get('id')]); 
    }
}

1 个答案:

答案 0 :(得分:2)

findAll将从商店获取并立即返回,稍后它将请求服务器并更新商店。但在你的情况下,因为你没有使用路由模型钩子,所以这个实时数组不会被更新,所以它不会在模板中反映它。

  

如果我首先访问路线/照片/身份证然后转到/照片,它会   只显示后者的一个对象。

在上述情况下,商店将只包含一个reocrd,因此当您使用findAll请求商店数据时,它将返回现有的单个记录。

另一个选择是,
避免这个photos.toArray() - 它会打破实时数组更新,我不知道为什么你需要它。因为photosDS.RecordArray

  

注意:注意DS.RecordArray不是JavaScript非常重要   array,它是一个实现Ember.Enumerable的对象。这是   重要的是,例如,如果您想要通过检索记录   索引,[]表示法不起作用 - 你必须使用   objectAt(index)代替。