我对 ember-data 有一个奇怪的问题,在一个入口点上它从服务器加载数据(我启用了登录服务器以查看发生了什么),但在另一个入口点上,然后将路由更改为与第一个选项,ember-data 根本不访问服务器。
我简直无法理解为什么会这样。
在我的应用程序中,如果我将浏览器指向 /posts,则会从服务器加载数据,一切正常。但是如果我指向 /settings,然后按照链接更改到 posts.index 的路由,则 ember-data 不会访问服务器。
另外,如果我的入口点是 /posts/new 并且我尝试创建一个新帖子,我会收到一个错误:
http://localhost:3000/api/unknown%20mixin)s 404 (Not Found)
可能是什么问题?
编辑:如果我通过调用findAll()
控制器的 init 函数来加载数据,则在首次实例化控制器时加载数据并且一切都很好..但我仍然不明白这种奇怪的行为。这是一个错误吗?
EDIT2:我创建了一个 github 项目来显示这个问题 - https://github.com/bsphere/ember-data-test
App.Router = Ember.Router.extend({
enableLogging: true,
root: Ember.Route.extend({
showposts: Ember.Route.transitionTo('posts.index'),
showSettings: Ember.Route.transitionTo('settings.index'),
index: Ember.Route.extend({
route: '/',
connectOutlets: function(router) {
router.transitionTo('posts.index');
}
}),
settings: Ember.Route.extend({
route: '/settings',
connectOutlets: function(router) {
router.get('applicationController').connectOutlet('navigation', 'navigation');
},
index: Ember.Route.extend({
route: '/',
connectOutlets: function(router) {
router.get('applicationController').connectOutlet('content', 'settings');
router.set('navigationController.selected', 'settings');
}
})
}),
posts: Ember.Route.extend({
newpost: Ember.Route.transitionTo('root.posts.new'),
editpost: Ember.Route.transitionTo('root.posts.edit'),
route: '/posts',
connectOutlets: function(router) {
router.get('applicationController').connectOutlet('navigation', 'navigation');
},
index: Ember.Route.extend({
route: '/',
connectOutlets: function(router) {
router.set('navigationController.selected', 'posts');
router.get('applicationController').connectOutlet('content', 'posts',
App.store.findAll(App.Post));
}
}),
new: Ember.Route.extend({
route: '/new',
connectOutlets: function(router) {
router.set('navigationController.selected', '');
router.get('applicationController').connectOutlet('content', 'post',
App.store.createRecord(App.Post));
router.set('postController.isEditing', false);
},
cancel: function(router) {
router.transitionTo('index');
},
didCreate: function(router) {
router.transitionTo('index');
}
}),
edit: Ember.Route.extend({
route: '/:id/edit',
connectOutlets: function(router, post) {
router.set('navigationController.selected', '');
router.get('applicationController').connectOutlet('content', 'post',
App.store.find(App.Post, post.get('id')));
router.set('postController.isEditing', true);
},
deserialize: function(router, context) {
return App.store.find(App.Post, context.id)
},
serialize: function(router, post) {
return {
id: post.get('id')
}
},
cancel: function(router) {
router.transitionTo('index');
},
didUpdate: function(router, post) {
router.transitionTo('index');
}
})
})
})
});