我正在尝试了解如何在我的控制器/路由之间共享数据。
我有一个显示公司数据的应用程序。以下是我想要的路线:
/ summary info
/companies list of all companies with some more detail
/companies/:id details about a single company
现在,所有三条路线所需的数据都包含在一个公司数据数组中。所以,我想在应用启动时加载数据,然后用于每条路线。我还需要在控制器上使用其他方法进行共享。
很明显,第二条和第三条路线是嵌套的,所以当我链接到特定公司时,我可以通过传递该公司的数据来共享CompaniesController
中的数据:
{{#linkTo 'company' company}}{{ company.name }}{{/linkTo}}
但总结路线是我陷入困境的地方。我提出了两个选项:
使用我需要的任何其他方法创建CompaniesController
,并通过扩展来创建IndexController
App.IndexController = App.CompaniesController.extend({});
然后,据我所知,两条路线都需要找到模型:
App.Router.map(function() {
this.resource('companies');
});
App.CompaniesRoute = Ember.Route.extend({
model: function() {
return App.Company.find();
}
});
App.IndexRoute = Ember.Route.extend({
model: function() {
return App.Company.find();
}
});
似乎应该有更好的方法,因为我必须为我添加的每个新路线重复此操作(例如/revenue
)。
将summary
路由嵌套在companies
资源中,并为其指定路径'/'。我不喜欢这个是我的UI的'嵌套'与数据不匹配。我似乎还必须为每条路线重新定义model
属性。
还有其他选择更好吗?
tl; dr:我应该如何跨控制器共享数据?
答案 0 :(得分:3)
要共享数据beetwen控制器,正确的方法是使用needs
API。
假设您的CompaniesController
包含您希望其他控制器可用的所有数据,您应该通过needs
定义它,这可以是一个简单的字符串,如果您定义更多字符串,则可以是字符串数组然后一个。
App.MyController = Ember.ObjectController.extend({
needs: ['companies'],
myFunction: function() {
// now you can access your companies controller like this
this.get('controllers.companies');
}
});
为了使事情更容易访问,您还可以另外定义绑定,例如:
App.MyController = Ember.ObjectController.extend({
needs: ['companies'],
companiesBinding: 'controllers.companies',
myFunction: function() {
// now you can access your companies controller like this
this.get('companies');
}
});
希望它有所帮助。