我正在使用Ember.Router,我无法弄清楚的一件事是如何将对象绑定到路由器实例化的控制器。
例如,这里是一个控制器类(扩展),路由器将为特定路由('page')实例化,以及控制器对象(已创建),比如处理用户管理任务的一部分路由器外的应用程序:
// 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如何访问路由器正在管理的控制器中的数据呢?
有什么想法吗?
答案 0 :(得分: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.initialize
。使用UserController
使用全局符号直接访问PageController
绝对是一种错误的耦合,但它可以完成您的工作。
一个绝对更好的解决方案也是在UserController
电话中绑定connectOutlet
的内容。