【问题标题】:ember.js seemingly picking the wrong controller for a routeember.js 似乎为路由选择了错误的控制器
【发布时间】:2013-03-07 15:59:38
【问题描述】:

我正在尝试使用 rails/ember.js 编写一个小博客应用程序。帖子可以被标记(使用acts-as-taggable-on),并且应该可以通过访问“/t/:tag_name”查看具有特定标签的所有帖子的列表。我在 post_controller.rb 的索引操作中使用“tagged_with”进行搜索(如果我没记错的话,通过 tagged_route.js 中的“find”调用)以及当我直接访问页面时(例如使用“/t/first ") 一切正常。

但是,当我转到其中一个帖子的页面并单击指向其中一个标签的链接时,ember.js 会停留在帖子控制器(.js 之一)中,同时转到正确的地址,我收到以下错误消息之一:

  • TypeError:arrangedContent.addArrayObserver 不是函数
  • TypeError: content.removeArrayObserver 不是函数
  • TypeError: get(...).objectAt 不是函数

我试过添加

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

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

这里是(可能)相关文件:

我的 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>

我的 post.handlebars 的相关部分:

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

【问题讨论】:

    标签: routing controller ember.js


    【解决方案1】:

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

    问题是 linkTo 没有触发我的 TaggedRoute 中的模型钩子,而 TaggedController(一个 ArrayController)正在尝试使用 linkTo 传递的字符串。

    我通过将 TaggedController 设为具有计算属性 postsWithTag 的 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;
      }
    });
    

    和 tagged.handlebars 到

    <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>
    

    【讨论】:

      猜你喜欢
      • 2018-02-27
      • 1970-01-01
      • 2017-11-04
      • 1970-01-01
      • 2012-01-11
      • 2012-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多