从计算财产中归还承诺

时间:2014-09-18 16:22:16

标签: ember.js ember-data

我意识到有几个类似的问题,但这些答案似乎都没有解决我的问题。我的目标是获取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。感谢您的投入!

2 个答案:

答案 0 :(得分: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 :(得分:3)

现在几乎没有更好的解决方案。我使用ember-promise-helpers

因此可以保持您的languagesFiltered代码完整无缺,并在您的hbs中执行以下操作:

{{#each (await languagesFiltered) as|lang|}}
 ...
 ...

更多 - https://emberigniter.com/guide-promises-computed-properties/

相关问题