【问题标题】:Ember data and metadata - accessing from controllerEmber 数据和元数据 - 从控制器访问
【发布时间】:2014-11-07 04:08:31
【问题描述】:

我正在尝试使用 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 发送查询是否有问题?有没有更好的方法来做到这一点?

顺便说一句,元数据由服务器发送为suggested in the docs.

我正在使用 Ember 1.6.1 和 Ember 数据 1.0.0-beta.8.2a68c63a

【问题讨论】:

  • 您说的问题是controller.loadClaims() 而不是controller.send('loadClaims')
  • 感谢您的建议。没有改变行为。

标签: ruby-on-rails ember.js ember-data active-model-serializers


【解决方案1】:

您可以尝试几种不同的方法来获取元数据。我没有写咖啡,所以我将尝试使用 javascript 描述解决方案。

  1. 将 ClaimsIndexController 的元属性声明为依赖于 model.meta 属性:meta: function() { return this.get('model.meta'); }.property('model.meta')

  2. 声明元属性为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);
    }
    
  3. 如您所见,不需要方法“loadClaims”,我们可以将“模型”描述为计算属性并在此处设置元:

    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')
    
  4. 甚至更简单:

    model: function () {
       return this.store.find('claim', { filter: this.get('filter') });
    }.property('filter'),
    
    meta: function() {
       return this.get('model.meta');
    }.property('model.meta')
    
  5. (有问题)在我看来,视图(模板)和数据必须最大限度地分开,所以我建议将所有元数据字段描述为控制器的计算属性:

    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')
    

【讨论】:

  • 很好的答案列表。我是 Ember 的新手,看到这些迭代真的很有帮助。我不会有一两天时间来测试这些,但我会的。
  • 在视图中访问这些的正确方法是什么?到目前为止,我无法使用 {{controller.meta.page}}{{controller.page}}{{page}} 从视图访问元数据。
  • 如果我从控制台访问商店,我可以使用store.metadataFor('claim') 从商店中检索元数据,但到目前为止我还无法通过模型获取元数据。文档似乎建议您可以通过store.find 的结果获取元数据,但我无法得到任何东西。还有什么想法吗?
  • Ember.ActiveModelSerializer.extractMeta 方法来自Ember.RESTSerializer (github.com/emberjs/data/blob/v1.0.0-beta.9/packages/ember-data/…),它从 playload.meta 属性接收元数据。因此,ember 期望像 { meta: { ... }, claims: [ ... ] } 这样的 JSON 作为来自 store.find('claims') 请求的响应负载。当然,您可以重载 extractMeta 元数据,并更改其行为以适应其他 JSON 模式。
猜你喜欢
  • 2022-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-18
相关资源
最近更新 更多