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)
永远不会被调用。因此,我的问题是:
- 实现我所追求的简单过滤器的最佳方法是什么
- 这是一个只读的计算属性,但在计算属性中处理异步值的最佳实践是什么
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())
来确认这一点,谢谢,删除了评论并对您的帖子进行了投票。下次小心点