Ember.js 从计算属性返回承诺

Ember.js 从计算属性返回承诺,ember.js,ember-data,Ember.js,Ember Data,我意识到有几个问题与此类似,但这些答案似乎都不能解决我的问题。我的目标是获取语言的列表,并对其进行筛选,以便我的模板可以显示完整列表的子集 我首先验证我的计算属性是否正常工作: MyController.js // Works as expected languagesFiltered: function() { return this.get('languages'); }.property('languages') languagesFiltered: function() {

我意识到有几个问题与此类似,但这些答案似乎都不能解决我的问题。我的目标是获取
语言的列表
,并对其进行筛选,以便我的模板可以显示完整列表的子集

我首先验证我的计算属性是否正常工作:

MyController.js

// Works as expected
languagesFiltered: function() {
   return this.get('languages');
}.property('languages')
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')
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')
然后我添加了一个过滤函数,但这里是我遇到麻烦的地方:

MyController.js

// Works as expected
languagesFiltered: function() {
   return this.get('languages');
}.property('languages')
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')
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')
我正在尝试使用
Ember.Array.filter
方法()。过滤器似乎工作正常,但现在
languagesFiltered
返回一个承诺,而Handlebar无法处理这个问题

我尝试了最后一种选择:

MyController.js

// Works as expected
languagesFiltered: function() {
   return this.get('languages');
}.property('languages')
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')
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。谢谢你的意见

您可以尝试返回一个,而不仅仅是承诺

你应该能做一些事情,比如

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

现在几乎没有更好的解决方案。我用

因此,您可以保持您的
语言过滤
代码完整,并在hbs内执行以下操作:

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

更多–

谢谢你,@tikotzky!你的解决方案非常有效。我没有意识到,当我有一个承诺数组时,我实际上可以将它们包装在
DS.PromiseArray
中。您实际上是在
DS.PromiseArray
中包装一个承诺。它是解析为数组的单个承诺。如果承诺解析为对象,那么您需要使用
DS.PromiseObject
Ah,感谢您的澄清。有趣的是,我可以直接返回
this.get('languages')
,但是对
this.get('languages')
的任何操作都必须包装在
DS.PromiseArray
中。你能解释一下吗?
ember data
在执行
this.get('languages')
时,实际上返回了一个
DS.PromiseArray
。您应该能够通过运行
console.log(this.get('languages').toString())
来确认这一点,谢谢,删除了评论并对您的帖子进行了投票。下次小心点