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()
- 它会破坏实时阵列更新,我不确定你为什么在这里需要它。因为 photos
是 DS.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.
因此,我的路线中有两条路径。我将两条路线创建为 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()
- 它会破坏实时阵列更新,我不确定你为什么在这里需要它。因为 photos
是 DS.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.