使用绑定与EmberJS路由器



我正在使用Ember.Router,有一件事我不知道如何将对象绑定到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如何访问路由器正在管理的控制器中的数据呢?

有什么想法吗?

您的示例中有一些错误。

首先,您不应该在声明时直接设置具有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.initialize之前设置App.router。让UserController使用全局符号直接访问PageController无疑是一种糟糕的耦合,但在您的情况下,它可以完成任务。

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