这是小提琴。

http://jsfiddle.net/inconduit/hf7XM/10/

重现此问题的步骤:

  • 单击“转到帖子”。
  • 单击'controllerFor'文本,不会清除该列表。
  • 单击全局参考文本,它将清除列表。

  • 看来controllerFor()返回的 Controller 引用实际上不是PostsIndexController吗?这是为什么?

    我在Route的setupController()钩子(Hook)中修改了它,以在App上设置对该 Controller 的全局引用,并且当我在emptyList2()中将该引用的内容设置为新数组时,该列表会在模板中正确清除。

    我使用controllerFor()错误吗?还是误解了返回的内容?是范围问题吗?请帮帮我。
    App.PostsIndexRoute = Ember.Route.extend({
      setupController : function(controller,model) {
        controller.set('content',['one','two','three']);
        App.postsIndexController = controller;
      }
    });
    
    // receives the {{action}} from the template
    App.PostsController = Ember.Controller.extend({
      emptyList : function() {
        this.controllerFor('postsIndex').set('content',Ember.A());
      },
      emptyList2 : function() {
        App.postsIndexController.set('content',Ember.A());
      }
    });
    

    最佳答案

    tldr:将controllerFor('postsIndex')替换为controllerFor('posts.index')
    emptyList2 fx之所以有效,是因为您将App.postsIndexController常量设置为 Controller 实例传递给setupController的任何常量。

    我认为比如何解决此问题更重要的是如何调试这些问题。这是我所做的:

    在运行JS小提琴的同时打开JS控制台。单击帖子链接之后但尝试清空列表之前,我运行了以下命令:

    Em.keys(App.__container__.cache.dict)
    ["application:main", "router:main", "route:application", "route:index", "controller:application", "template:application", "controller:index", "template:index", "route:posts", "route:posts.index", "controller:posts", "template:posts", "controller:posts.index", "template:posts.index"]
    

    然后,在单击EmptyList操作之后,再试一次:
    Em.keys(App.__container__.cache.dict)
    ["application:main", "router:main", "route:application", "route:index", "controller:application", "template:application", "controller:index", "template:index", "route:posts", "route:posts.index", "controller:posts", "template:posts", "controller:posts.index", "template:posts.index", "controller:postsIndex"]
    

    查看现在如何有两个App.PostsIndexController的缓存实例:controller:postsIndex和controller:posts.index

    然后,我在jsFiddle中添加了一些console.logs来查看正在引用的实例。从那里很容易进行修复。由于Ember向每个对象添加了toString()方法,因此很容易看到发生了什么。例如:
    controllerFor("postsIndex").toString()
    <App.PostsIndexController:ember218>
    

    在这里更新小提琴:http://jsfiddle.net/mgrassotti/Aa2WX/2/

    关于ember.js - 在ember v2路由器中,为什么controllerFor()没有提供对此 Controller 的引用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14385429/

    10-09 14:39