2013-03-25 69 views
4

我想使用Emberjs 需要api *从评论控制器访问Postscontroller。 PostController由路由支持,而我不希望评论的控制器拥有路由。emberjs控制器的需求返回undefined,无法访问controller.content

在评论控制器中,我有需求:['posts','postsShow']。从评论控制器,当我运行控制台日志使用下面的命令,,:

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

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

在控制台中我看到:

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

然而,当我试图访问控制器内容对于PostsShowController或PostsController,它始终返回后未定义。这是我已经试过各种方法仍然有后未定义

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

       or 

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

此外,我试图从这样的内容获得“评论”:

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

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

      or 

comment = post.comments; 

我还是得到了错误:

TypeError: post is undefined comment = post.comments; 

TypeError: post is undefined var comment = post.get('comments'); 

也这意味着:

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

    also returns post is undefined. 

这是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'); 

     } 

    }); 

非常感谢

回答

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); 
    } 
}); 

所以,你应该做的任何

needs: ['postsIndex', 'postsShow'] 

然后:

this.get('controllers.postsIndex.content') 

或修复路线:

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); 
    } 
}); 

Updated fiddle

+0

非常感谢您的帮助。当我将一个console.log放在变量持有存储上时,它返回** TypeError:post.get不是一个函数store = console.log(post.get('store.transaction')); **。 ** [从你的小提琴更新显示](http://jsfiddle.net/mzseQ/2/)**。你有一个想法,为什么这是。这可能是为什么**单击addComment **不会按照这个较老的** [jsfiddle具有类似代码](http://jsfiddle.net/CD9ck/4/)**返回评论表单当我们点击** addComment **时,评论表单除外**在提交时不会创建评论**。谢谢。 – brg 2013-03-25 13:11:37

+1

许多问题与: - 你不能做variable = console.log(某事),你必须做variable = something。 - 如果你想要一篇文章,你需要'postsShow.content'而不是'postsIndex.content' - 'post.get('store.transaction')'只是一个函数。您需要'transaction = this.get('store')。transaction()'或'post.get('transaction')' – 2013-03-25 13:19:56

+0

非常感谢您的耐心和您提供的有用洞察。我根据上面的建议更正了** [jsfiddle](http://jsfiddle.net/mzseQ/3/)**。所有的错误都消失了,**只剩下一个问题**。当我点击** addComment **时,它不会显示评论表单,并在控制台中看到** undefined **。有什么建议么。谢谢 – brg 2013-03-25 13:37:40