Ember访问阵列控制器来自另一个控制器的内容

时间:2014-12-05 23:25:11

标签: ember.js ember-data

我有两个控制器: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,为什么我无法访问其数据?因此,我如何获得对其数据的访问权?

我非常感谢你明白这一点。

2 个答案:

答案 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提供的方法。