Ember 没有调用路由器的 setupController

Ember not calling setupController of router

因此,我的路线中有两条路径。我将两条路线创建为 doc recommends.

我的路由器如下:

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

如果我先访问路线/photo/ID,然后转到/photos,后者只会显示一个对象。 (错误)

如果我先访问 /photos,它会显示所有对象,稍后我可以访问 /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')]); 
    }
}

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

If I visit firstly the route /photo/ID and then go to /photos, it will only show one object on the latter.

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

另一种选择是,
避免这个 photos.toArray() - 它会破坏实时阵列更新,我不确定你为什么在这里需要它。因为 photosDS.RecordArray.

Note: It's important to note that DS.RecordArray is not a JavaScript array, it's an object that implements Ember.Enumerable. This is important because, for example, if you want to retrieve records by index, the [] notation will not work--you'll have to use objectAt(index) instead.