2

这是小提琴。

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

重现问题的步骤:

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

似乎返回的控制器引用controllerFor()实际上不是PostsIndexController? 这是为什么?

我在setupController()Route 的挂钩中对其进行了破解,以便在 App 上设置对该控制器的全局引用,当我将该引用上的内容设置为 in 中的新数组时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());
  }  
});
4

1 回答 1

6

tldr:替换controllerFor('postsIndex')controllerFor('posts.index')


emptyList2 fx 正在工作,因为您将App.postsIndexController常量设置为任何控制器实例被传递给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"]

看看现在有 2 个 App.PostsIndexController 的缓存实例:controller:postsIndex 和 controller:posts.index

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

controllerFor("postsIndex").toString()
<App.PostsIndexController:ember218>

Updated fiddle here: http://jsfiddle.net/mgrassotti/Aa2WX/2/

于 2013-01-17T20:23:21.667 回答