ember.js - 在 ember v2 路由器中,为什么controllerFor() 不提供对此 Controller 的引用?

标签 ember.js ember-router

这是 fiddle 。

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

重现问题的步骤:

  • 点击“转到帖子”。
  • 点击“controllerFor”文本,不会清除列表。
  • 点击全局引用文本,将会清除列表。

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

我在路由的 setupController() Hook 中破解了它,以在应用程序上设置对该 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 常量设置为传递给 setupController 的任何 Controller 实例。

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

在运行 JS fiddle 时打开 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.log 以查看引用了哪些实例。从那里开始修复就很容易了。由于 Ember 为每个对象添加了 toString() 方法,因此很容易看出发生了什么。例如:

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

此处更新了 fiddle :http://jsfiddle.net/mgrassotti/Aa2WX/2/

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

相关文章:

ember.js - 同时使用 DS.FixtureAdapter 和 DS.RESTAdapter

ember.js - Ember CLI构建被杀死

ember.js - 在 ember 路由器 v2 中使用非 ID 动态参数

javascript - Ember.js 过渡渲染错误或错误的路由

javascript - Emberjs - 如何从组件方法中获取当前路由器路径

javascript - Ajax Promise on Property 不返回数据

ember.js - 如何设置 mocha 测试来运行 Ember 初始值设定项以便定义注入(inject)对象?

javascript - 传递给 Handlebars 助手的参数显示为键而不是值

javascript - Ember.js 路由器/ Controller 属性

ember.js - 每次路线改变时的触发方法