我正在尝试使用ActiveModelAdapter使用Ember Data访问元数据。如果控制器在路由器中设置了型号:
App.ClaimsIndexRoute = Ember.Route.extend
authRedirectable: true
model: ->
@store.findAll 'claim'
控制器作为元方法如下:
App.ClaimsIndexController = Ember.ArrayController.extend
meta: (->
@store.metadataFor('claim')
).property()
然后我可以访问索引模板中的元数据:
{{meta.page}} {{meta.per_page}} {{meta.total_pages}}
但我需要添加过滤功能。所以我改变路由器使用setupController
:
App.ClaimsIndexRoute = Ember.Route.extend
setupController: (controller, model) ->
controller.loadClaims()
在控制器中添加了loadClaim函数:
App.ClaimsIndexController = Ember.ArrayController.extend
loadClaims: ->
_filter = @get 'filter'
_result = @store.find 'claim', {filter: _filter}
@set 'model', _result
filter: ''
meta: (->
@store.metadataFor('claim')
).property()
actions:
filterClaims: ->
@loadClaims()
现在元数据不再可用。我已经使用调试器进入上下文,似乎无法获得任何东西。
向Ember Data发送查询是否有问题?有更好的方法吗?
顺便提一下,服务器将元数据发送为suggested in the docs.
我正在使用Ember 1.6.1和Ember数据1.0.0-beta.8.2a68c63a
答案 0 :(得分:4)
您可以尝试几种不同的方式来获取元数据。我没有写过咖啡,所以我会尝试用javascript来描述解决方案。
声明ClaimsIndexController的元属性取决于model.meta属性:meta: function() { return this.get('model.meta'); }.property('model.meta')
将元属性声明为null,稍后在loadClaims方法的过滤器请求的then
回调中实现它:
loadClaims: function () {
var filteredClaims = this.store.find('claim', { filter: this.get('filter') }),
self = this;
filteredClaims.then(function(claims) {
self.set('meta', claims.get('meta'));
});
this.set('model', claims);
}
正如您所看到的,不需要方法' loadClaims'我们可以描述' model'作为计算属性和设置元在这里:
model: function () {
var filteredClaims = this.store.find('claim', { filter: this.get('filter') }),
self = this;
filteredClaims.then(function(claims) {
self.set('meta', claims.get('meta'));
});
return filteredClaims;
}.property('filter')
甚至更简单:
model: function () {
return this.store.find('claim', { filter: this.get('filter') });
}.property('filter'),
meta: function() {
return this.get('model.meta');
}.property('model.meta')
(有问题)在我看来,View(模板)和数据必须最大程度地分开,所以我建议将所有元数据字段描述为控制器的计算属性:
model: function () {
return this.store.find('claim', { filter: this.get('filter') });
}.property('filter'),
page: function() {
return this.get('model.meta.page');
}.property('model.meta.page'),
perPage: function() {
return this.get('model.meta.per_page');
}.property('model.meta.per_page'),
totalPages: function() {
return this.get('model.meta.total_pages');
}.property('model.meta.total_pages')