使用绑定与EmberJS路由器?

Nat*_*man 2 javascript ember.js ember-old-router

我正在使用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
    })
});
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

Mik*_*ski 5

您的样本中存在一些错误.

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

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

第二个错误是命名usersController:它应该是UsersController,因为它是一个类,它将usersControllerinitialize调用期间注入路由器.用户复数和ObjectController似乎也很奇怪.当然应该单一化......

最后,当然对于这个问题最有趣的是,一旦你应用了前面的评论,你就可以使用以下方法设置绑定:

App.UserController = Em.ObjectController.extend({
  fooBinding: 'App.router.pageController.foo'
});
Run Code Online (Sandbox Code Playgroud)

App.router可以在你打电话之前设置App.initialize.UserController使用全局符号直接访问PageController它确实是一个不好的耦合,但它在你的情况下完成了工作.

一个绝对更好的解决方案也是绑定呼叫中UserController的内容connectOutlet.