2014-09-18 74 views
4

我意識到有類似這樣的幾個問題,但沒有一個答案似乎解決了我的問題。我的目標是獲取language的列表,並對它們進行過濾,以便我的模板可以顯示完整列表的子集。從計算屬性返回承諾

我開始通過驗證我的計算物業工作:

MyController.js

// Works as expected 
languagesFiltered: function() { 
    return this.get('languages'); 
}.property('languages') 

然後我在過濾器中添加的功能,但在這裏就是我遇到了麻煩:

MyController.js

languagesFiltered: function() { 
    // console.log shows that languages is actually a promise 
    var languages = this.get('languages'); 

    // all of this returns a promise, but Handlebars can't handle the promise 
    return languages.then(function(languagesArray) { 
     return languagesArray.filter(function(item, index, enumerable) { 
     return item.get('name') !== 'English'; 
     }); 
    }) 
}.property('languages') 

我試圖使用Ember.Array.filter方法(http://emberjs.com/api/classes/Ember.ArrayProxy.html#method_filter)。該過濾器似乎工作正常,但現在languagesFiltered返回一個承諾,Handlebars無法處理。

我想最後一個選擇:

MyController.js

languagesFiltered: function() { 
    var languages = this.get('languages'); 

    // "return languages;" works 
    // But "return languages.filter" returns an empty array 
    return languages.filter(function(item, index, enumerable) { 
     console.log(item); 
     return true; 
    }); 
}.property('languages') 

而且console.log(item)不會被調用。所以我的問題是:

  • 什麼是最好的方式來實現簡單的過濾器我後?
  • 這是一個只讀的計算屬性,但在計算屬性中處理異步值的最佳做法是什麼?

我使用Ember 1.7.0-beta4,Ember Data 1.0.0-beta10和ember-cli 0.44。我會升級到Ember 1.7.0,但是有一個小錯誤影響了我們應用程序的另一部分,所以我們要等到1.7.1。感謝您的輸入!

回答

17

您可以嘗試退回PromiseArray而不僅僅是承諾。

你應該能夠做這樣的事情..

languagesFiltered: function() { 
    // all of this returns a promise, but Handlebars can't handle the promise 
    var promise = this.get('languages').then(function(languagesArray) { 
     return languagesArray.filter(function(item, index, enumerable) { 
     return item.get('name') !== 'English'; 
     }); 
    }) 

    return DS.PromiseArray.create({ 
     promise: promise 
    }); 

}.property('languages') 
+1

謝謝@tikotzky!您的解決方案完美運作我沒有意識到,當我有一組promise時,我實際上可以將它們包裝在'DS.PromiseArray'中。 – 2014-09-18 16:55:32

+0

你實際上是在'DS.PromiseArray'中包裝一個單一的承諾。它是一個解決數組的單個承諾。如果承諾解決了一個對象,那麼你將需要使用'DS.PromiseObject' – tikotzky 2014-09-18 16:58:33

+0

啊,謝謝澄清。有趣的是,我可以直接返回'this.get('languages')',但是'this.get('languages')'的任何操作都必須包含在DS中。PromiseArray'。你能解釋一下嗎? – 2014-09-18 17:03:16