Ember.js似乎为路由选择了错误的控制器



我试图用rails/ember.js写一个小博客应用程序。帖子可以被标记(使用acts-as- tagable -on),并且可以通过访问"/t/:tag_name"来查看具有某个标签的所有帖子的列表。我正在做搜索与"tagged_with"在post_controller。Rb的索引操作(通过"查找"在tagged_route.js如果我没弄错的话),当我直接访问页面时(例如使用"/t/first"),一切都很好。

然而,当我去到一个帖子的页面,点击链接到那里的标签之一,ember.js留在post控制器(.js一个),而去到正确的地址,我得到以下错误信息之一:

  • TypeError: arrangedContent。addArrayObserver不是一个函数
  • TypeError:内容。removeArrayObserver不是一个函数
  • TypeError:获得(…)。objectAt不是一个函数

我试过添加

controllerFor: function() {
  return EmberBlog.TaggedController;
}

到tagged_route.js中,但是标签页面上找到的帖子列表仍然是空的。有人知道我哪里做错了吗?

以下是(可能)相关的文件:

我router.js

:

EmberBlog.Router.map(function() {
// default index route to / loading index template
  this.resource("posts", function() { // implicit path and template name (same as route name)
    //this.route('new');
  });
  this.resource('post', { path: '/posts/:post_id' });
  this.resource('tagged', { path: '/t/:tag_name' });
  this.route("about");
});
EmberBlog.reopen({
  location: 'history'
});
我tagged_route.js

:

EmberBlog.TaggedRoute = Ember.Route.extend({
  model: function(params) {
    Em.Logger.info( params );
    var posts = EmberBlog.Post.find({'tag_name': params.tag_name});
    return posts;
  }//,
  //controllerFor: function() {
  //  return EmberBlog.TaggedController;
  //}
});

我的post_controller.rb:

def index
  if params[:tag_name]
    posts = Post.tagged_with(params[:tag_name])
  else
    posts = Post.all
  end
  render json: posts, meta: { total: posts.count }
end
我tagged.handlebars

:

<h2>Tagged Posts</h2>
<div id="posts">
  {{log controller}}
  <ul>
    {{#each post in controller}}
      {{view EmberBlog.PostInListView contentBinding="post"}} //--> <li>{{#linkTo post post}}{{post.title}}{{/linkTo}}</li>
    {{else}}
      Sorry, no posts to display
    {{/each}}
  </ul>
</div>

my post.handlebars:

...
<div class="taglist">
  <ul class="inline">
    Tags:
    {{#each tag in tagList}}
      <li>{{#linkTo tagged tag}}{{tag}}{{/linkTo}}</li>
    {{else}}
...

我在这个问题的答案的帮助下发现了问题。

问题是linkTo没有触发模型钩子在我的TaggedRoute和TaggedController(一个ArrayController)试图与linkTo传递的字符串工作。

我通过使用计算属性postsWithTag使TaggedController成为ObjectController来解决这个问题

EmberBlog.TaggedController = Ember.ObjectController.extend({
  content: null,
  postsWithTag: function() {
    var posts = EmberBlog.Post.find({'tag_name': this.get('content')});
    return posts;
  }.property('@content')
});

并将TaggedRoute更改为

EmberBlog.TaggedRoute = Ember.Route.extend({
  model: function(params) {
    Em.Logger.info( params );
    var tag = params.tag_name;
    return tag;
  }
});

和标记的。车把

<h2>Tagged Posts</h2>
<div id="posts">
  {{log controller}}
  <ul class="unstyled">
    {{#each post in postsWithTag}}
      {{view EmberBlog.PostInListView contentBinding="post"}}
    {{else}}
      Sorry, no posts to display
    {{/each}}
  </ul>
</div>

最新更新