emberjs控制器的需求返回undefined并且无法访问controller.content

brg*_*brg 4 ember.js

我试图使用Emberjs 需要api*从评论控制器访问Postscontroller.PostController由路由支持,而我不希望注释的控制器有路由.

在评论控制器中,我有需要:['posts','postsShow'].在评论控制器中,当我使用以下命令运行控制台日志时:

    console.log( this.get('controllers.postsShow') );

    console.log( this.get('controllers.posts') );
Run Code Online (Sandbox Code Playgroud)

在控制台中我看到:

<EmBlog.PostsShowController:ember396> { target=<EmBlog.Router:ember316>, namespace=EmBlog, store=<EmBlog.Store:ember336> 

 <EmBlog.PostsController:ember304> { target=<EmBlog.Router:ember316>, namespace=EmBlog, store=<EmBlog.Store:ember336>
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试访问 PostsShowController或PostsController 的控制器内容时,它总是返回post undefined.这些是我尝试过的各种方法,但仍未定义:

 var post = this.get('controllers.posts').get('content');

              or

var post =  this.get('controllers.posts.content');
Run Code Online (Sandbox Code Playgroud)

我还尝试从这样的内容中获取"评论":

var post = this.get('controllers.posts')

var comment = post.get('comments');

          or

 comment = post.comments;
Run Code Online (Sandbox Code Playgroud)

我仍然得到错误:

 TypeError: post is undefined  comment = post.comments;

 TypeError: post is undefined var comment = post.get('comments');
Run Code Online (Sandbox Code Playgroud)

这也意味着:

  var post =  this.get('controllers.posts.model').get('store.transaction');

  also returns post is  undefined.
Run Code Online (Sandbox Code Playgroud)

这是jsfiddle,代码的相关部分粘贴在下面:

    EmBlog.PostsNewController = Ember.ObjectController.extend({
       content: null
    });

    EmBlog.PostsShowController =
       Ember.ObjectController.extend({
       content: null
    });


   EmBlog.CommentNewController = Em.ObjectController.extend({

       needs: ['posts', 'postsShow'],    
       isAddingNew: false,

      addComment: function(body){

           console.log( this.get('controllers.postsShow') );

           console.log( this.get('controllers.posts') );

           var post =  this.get('controllers.posts.content');
               store = post.get('store.transaction');

      }

  });
Run Code Online (Sandbox Code Playgroud)

非常感谢

Ted*_*nny 6

那是因为posts控制器是空的.你正在填写帖子PostIndexController,而不是PostsController.

检查路线:

EmBlog.PostsRoute  = Ember.Route.extend({
});

EmBlog.PostsIndexRoute  = Ember.Route.extend({
  model: function(){
    return EmBlog.Post.find();
  },
  setupController: function(controller, model){
    controller.set('content', model);
  }
});
Run Code Online (Sandbox Code Playgroud)

所以你应该这样做

needs:  ['postsIndex', 'postsShow']
Run Code Online (Sandbox Code Playgroud)

然后:

this.get('controllers.postsIndex.content')
Run Code Online (Sandbox Code Playgroud)

或修复你的路线:

EmBlog.PostsRoute  = Ember.Route.extend({
  model: function() {
    return EmBlog.Post.find();
  }
});

EmBlog.PostsIndexRoute  = Ember.Route.extend({
  model: function(){
    return this.modelFor('posts');
  },
  setupController: function(controller, model){
    controller.set('content', model);
  }
});
Run Code Online (Sandbox Code Playgroud)

更新了小提琴