查看 Ember 文档,如果控制器与路由相关联,这似乎会自动发生
这是正确的,与路由关联的控制器将在需要时由 ember 自动实例化。
但是如果我只想要一个将视图和模型联系在一起的临时控制器呢?这可能适用于我页面上的任意组件。我是否负责实例化控制器?我应该使用某种控制器绑定属性吗?它会用我的模型自动实例化,还是用我的视图自动实例化?
有不同的方法可以让您的任意控制器通过 ember 自动实例化,而无需自己动手。
对于示例,假设您有一个不与任何名为的路由关联的控制器LonelyController
,
App.LonelyController = Ember.ArrayController.extend({
content: ['foo', 'bar', 'baz']
});
方法一
假设您有一条路线并且您连接到setupController
,如果您尝试在这里请求您LonelyController
,this.controllerFor('lonely');
这将使 ember 为您实例化它:
App.IndexRoute = Ember.Route.extend({
setupController: function(controller, model) {
this.controllerFor('lonely').get('content');
// the above line will retrive successfully
// your `LonelyController`'s `content` property
}
});
方法二
另一种让LonelyController
ember 自动实例化的可能方法是needs
在另一个控制器中定义与 API 的依赖关系:
App.IndexController = Ember.ObjectController.extend({
needs: 'lonely',
someAction: function() {
this.get('controllers.lonely').get('content');
// the above line will retrive successfully
// your `LonelyController`'s `content` property
}
});
使用needs
API,您还可以执行以下操作:
App.IndexController = Ember.ObjectController.extend({
needs: 'lonely',
lonelysContentBinding: 'controllers.lonely.content',
someAction: function() {
this.get('lonelysContent');
// the above line will retrive successfully
// your `LonelyController`'s `content` property
}
});
还有一些上述方法的其他组合可以让您LonelyController
自动实例化,但我想现在应该更清楚了。
最后一个提示:要了解 ember 在后台自动创建的内容,您还可以启用生成日志记录以在控制台中观察这一点,这非常有帮助,方法是:
var App = Ember.Application.create({
LOG_ACTIVE_GENERATION: true
});
希望能帮助到你。