2

我正在使用 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 如何访问路由器管理的控制器中的数据呢?

有任何想法吗?

4

1 回答 1

5

您的样本中有一些错误。

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

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

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

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

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

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

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

于 2012-07-26T06:24:30.087 回答