1

我试图使用Ember数据,使用ActiveModelAdapter访问元数据。如果控制器设置在路由器型号:Ember数据和元数据 - 从控制器访问

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.

我使用灰烬1.6.1和灰烬数据1.0.0-beta.8.2a68c63a

+0

是您的问题,你说'controller.loadClaims()的''而不是controller.send( 'loadClaims')'? – 2014-09-13 00:47:00

+0

感谢您的建议。没有改变行为。 – noel 2014-09-15 03:54:07

回答

4

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

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

  2. 声明元属性为空并在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'描述为计算属性并在此处设置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') 
    
  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') 
    
+0

很好的答案。我是Ember新手,看到这些迭代真的很有帮助。我将没有时间来测试一两天,但我会。 – noel 2014-09-15 17:19:23

+0

什么是在视图中访问这些的正确方法?到目前为止,我无法使用“{{controller.meta.page}}”或“{{controller.page}}”或“{{page}}”从视图访问元数据。 – noel 2014-09-16 19:21:43

+0

如果我从控制台访问商店,我可以使用'store.metadataFor(“声明”)'取回保存的元,但到目前为止,我已经无法通过模型来获得元。该文档似乎建议您可以通过'store.find'的结果获取元数据,但我一直无法获取任何内容。还有什么想法? – noel 2014-09-16 19:26:50

相关问题