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

相關問題