[英]Ember.js: showing multiple database-backed resources/models in the same page/route?
我正在以预算经理的形式使用Ember编写一个小测试应用程序。 我有一个Budget对象,它包含一般属性,如每月限制和描述。 我还有一组Expense对象,其中包含名称,花费的金额等。两者都是使用Ember Data的REST适配器从服务器检索的。
HTML:
<body>
<script type="text/x-handlebars" data-template-name="budget">
<h2>{{name}} (€ {{amount}})</h2>
</script>
<script type="text/x-handlebars" data-template-name="expenses">
<ul id="expense-list">
{{#each model}}
{{render "expense" this}}
{{/each}}
</ul>
</script>
<!-- expense template -->
<script type="text/x-handlebars" id="expense">
<li>
<label>{{description}}</label>
<label class="subtle">{{formatDate time}}</label>
<label class="amount">{{amount}}</label>
</li>
</script>
</body>
</html>
JavaScript :
window.App = Ember.Application.create();
App.ApplicationAdapter = DS.RESTAdapter.extend({
host: 'http://localhost:5000',
namespace: 'outthepocket/api'
});
// Model
App.Expense = DS.Model.extend({
amount: DS.attr('number'),
description: DS.attr('string'),
time: DS.attr('date')
});
App.Budget = DS.Model.extend({
name: DS.attr('string'),
amount: DS.attr('number')
});
// Routes
App.Router.map( function() {
this.resource('budget');
this.resource('expenses');
});
App.ExpensesRoute = Ember.Route.extend({
model: function()
{
return this.store.find('expense');
}
});
App.BudgetRoute = Ember.Route.extend({
model: function()
{
return this.store.find('budget', 1);
}
});
按照我在所有Ember教程中看到的架构,有一个ExpensesRoute,其中费用列表作为其模型,而BudgetRoute则以所选预算作为其模型。 只要我通过正确的URL查看每个资源,这都很有用:
我现在遇到的问题是我想在一个页面 (索引页面) 上显示两个模板及其数据 。 我为此尝试了两种解决方案:
解决方案1 :拥有单独的路径和模板,并在主应用程序模板中调用{{render budget}}和{{render expenses}}。 这会渲染两个模板,但没有任何数据。
解决方案2 :只有一个IndexRoute并从其模型属性返回预算和费用,将它们呈现为索引模板。 这或多或少都有效,但似乎与Ember相反,不同的资源,路线和控制器分离得很好。
有什么想法吗? 我已经完成了五六个教程和Ember的官方指南,但没有一个明确说明如何组装一个单页的Web应用程序,其中包含多个资源支持的多个模板,而无需链接到不同的页面/路由。
您可以使用Ember.RSVP.hash
在单个对象中加载多个模型:
App.IndexRoute = Ember.Route.extend({
model: function()
{
return Ember.RSVP.hash({
expenses: this.store.find('expense'),
budget: this.store.find('budget', 1)
})
}
});
在模板中,您可以通过密钥访问每个已解析的承诺:
{{expenses}}
将返回this.store.find('expense')
承诺的结果, {{budget}}
结果来自this.store.find('budget', 1)
承诺。
因此,在您的索引模板中,您将能够:
<script type="text/x-handlebars" id="index">
{{render "expenses" expenses}}
{{render "budget" budget}}
</script>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.