我正在尝试使用Ember Data和ActiveModelAdapter访问元数据。如果控制器设置在型号为的路由器中
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发送查询有问题吗?有更好的方法吗?
顺便说一句,元数据是由服务器按照文档中的建议发送的。
我使用的是Ember 1.6.1和Ember数据1.0.0-beta.8.2a68c63a
您可以尝试几种不同的方法来获取元数据。我没有写关于咖啡的文章,所以我将尝试使用javascript描述解决方案。
-
将ClaimsIndexController的元属性声明为依赖于model.meta属性:
meta: function() { return this.get('model.meta'); }.property('model.meta')
-
将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"描述为计算属性,并在这里设置meta:
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')
-
(有问题)在我看来,视图(模板)和数据必须最大限度地分离,所以我建议将所有元数据字段描述为控制器的计算属性:
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')