【问题标题】:Using Bindings with the EmberJS Router?在 EmberJS 路由器中使用绑定?
【发布时间】:2012-07-25 18:03:47
【问题描述】:

我正在使用 Ember.Router,但我不知道如何将对象绑定到路由器正在实例化的控制器。

例如,这是一个控制器类(扩展),路由器将为特定路由(“页面”)实例化,以及一个控制器对象(创建),例如处理部分用户管理任务路由器外的应用程序:

// controller used by Router to render the "page" route
App.PageController = Em.ObjectController.extend({
    content: Em.Object.extend({
        foo: 'bar'
    })
});

// global controller for users
App.usersController = Em.ObjectController.extend({
    content: Em.Object.extend({
        fooBinding: App.PageController.foo
        // the above will not work since Em.Router
        // instantiates the page controller dynamically
    })
});

所以当路由器加载时,它会将 App.PageController 实例化为 App.router.pageController,但那是在 App.usersController 已经创建之后。那么 App.usersController 如何访问 Router 管理的控制器中的数据呢?

有什么想法吗?

【问题讨论】:

  • 我已经问过similar question,如果您使用的是 ember-0.9.8.1,它可能会对您有所帮助,如果您使用的是 ember-latest,那么会有一些差异

标签: javascript ember.js ember-old-router


【解决方案1】:

您的示例中有一些错误。

首先,您永远不应该在声明时直接使用 Object 值设置属性:该值将在类的所有实例之间共享。在这里,它真的很重要,但这是一种不好的做法。在这种情况下,设置 PageController 内容的好方法是将其绑定到路由器中,在 connectOutlet 调用处,如下所示:

connectOutlets: function (router) {
  var theContainerController = router.get('theContainerController'),
      objectWithFooBar = Ember.Object.create({
    foo: 'bar'
  });
  theContainerController.connectOutlet('page', objectWithFooBar);
}

第二个错误是usersController的命名:它应该是UsersController,因为它是一个类,在initialize调用过程中将作为usersController注入路由器。让用户多元化和 ObjectController 似乎也很奇怪。当然应该单数化...

最后,当然也是关于这个问题最有趣的是,一旦你应用了前面的注释,你将能够使用以下方法设置绑定:

App.UserController = Em.ObjectController.extend({
  fooBinding: 'App.router.pageController.foo'
});

App.router 可以在您致电App.initialize 之前设置。让UserController 使用全局符号直接访问PageController 绝对是一个糟糕的耦合,但它在您的情况下可以完成这项工作。

一个绝对更好的解决方案是在connectOutlet 调用中绑定UserController 的内容。

【讨论】:

  • 迈克,感谢您提供的信息。那么,你是说在使用Router的时候,所有的controller都应该用Router来实例化吗?我试图展示一个与路由器(PageController)一起使用的控制器和一个始终处于活动状态的全局控制器(userController)的示例。错误是我为 userController 使用了 .extend() 而不是 .create(),这很令人困惑。
  • 事实上,是的,所有的控制器都会被App.initialize()调用实例化并注入到路由器中。
  • Mike,你认为你在这里的建议可以被看作是一个可能的解决方案:github.com/emberjs/ember.js/issues/1521,以及由此显示的问题:jsfiddle.net/6p6XJ/79。我没有打开问题或创建小提琴,但对解决方案的兴趣不会降低。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多