我有两个控制器:postsController和postController。邮政路线没有嵌套在帖子下面(我不想这样做,因为我希望帖子视图被帖子视图替换,而不是添加到帖子视图中。)
这就是我的路由器的样子。
this.resource('posts', {path: '/'}, function(){
// this.route('index', {path: '/'});
});
this.resource('post', { path: 'posts/:id' }, function(){
this.route('show');
}
现在,postsController:
App.PostsRoute = Ember.Route.extend({
model: function(){
return this.store.find('post');
},
})
App.PostsController = Ember.ArrayController.extend({
testProperty: "This is a test"
})
和PostController:
App.PostRoute = Ember.Route.extend({
model: function(params){
return this.store.find('post', params.id);
},
})
App.PostController = Ember.ObjectController.extend({
needs: ['posts'],
percentValue: 100,
progressBarWidth: null,
advancePost: function(delta) {
var that = this;
var posts = that.get('controllers.posts');
// debugger <-- This is where all my questions are concerned with.
...
},
actions: {
nextPost: function() {
this.advancePost(1);
},
previousPost: function() {
this.advancePost(-1);
},
}
})
因此。 PostController'需要'PostsController,并且在动作advancePost上,需要访问PostsController的模型(它应该包含一个Post Objects数组。)在调试器的位置,变量发布了postsController。此时,如果我跑
posts.get('testProperty') // => gives "This is a test", which is correct.
在Chrome控制台上,我得到“这是一个测试”。所以我知道我已经获得了Posts Controller本身的访问权限。但是,以下任何尝试:
posts.get('model') // gives []??
posts.get('content') // gives []??
返回一个空数组([])。
我不明白为什么。如果我可以访问Posts arrayController,为什么我无法访问其数据?因此,我如何获得对其数据的访问权?
我非常感谢你明白这一点。
答案 0 :(得分:0)
首先,如果我了解您的上下文,我认为您应该在post
下嵌套posts
:
this.resource('posts', {path: '/'}, function(){
this.route('post', {path: '/:id'});
});
然后,由于posts
是您的“父”路由,因此您不再需要在控制器中声明needs
依赖项。
要访问您的帖子,请在Route
:
setupController: function(controller, model) {
this._super(controller, model);
controller.set('posts', this.modelFor("posts").get("content"));
}
答案 1 :(得分:0)
您应该考虑要支持的交互模式。用户回到他们刚才看到的项目列表是否典型?重新加载帖子,同时将滚动位置保持在他们所在的列表中将是有问题的。此外,从服务器重新获取并拆除和设置DOM还有很多开销,而不仅仅是将其留在那里。
您打算在过渡时使用动画吗?使用像液体火一样的东西将需要两个出口来执行动画,因此在这种情况下拆除列表是没有意义的。
CSS可用于让嵌套的出口填充它所放置的任何容器,允许使用Pascal Boutin提供的方法。