我试图在控制器中循环Ember中的一些对象,并返回其名称属性的数组。然而,我对Ember从findAll函数返回的内容感到困惑。
在控制器中,我有以下功能 -
possibleGenres: function() {
var genres = this.store.findAll('genre');
var genreNames = genres.map(function(item, index, enumerable){
return item.get('name');
});
return genreNames;
}.property(),
记录genres.get('length')给我0。
我已经证明findAll函数中有类型可用,因为当从findAll函数返回返回的类型时,它们会显示在模板中。
我是否误解了关于Ember控制器的重要信息?
与以往一样,非常感谢任何帮助。
答案 0 :(得分:2)
正如其他人所说,问题是findAll
会返回一个承诺,因此您必须使用.then()
等待承诺解决才能使用数据。
我认为更简洁的方法是将genres
设置为属性,然后将genreNames
作为计算属性来观察genres
数组。请注意,当计算属性返回时,Ember会自动展开承诺,因此在这种情况下您不必使用.then()
:
export default Ember.Controller.extend({
genreNames: Ember.computed.mapBy('genre', 'name'),
genres: function() {
return this.store.findAll('genre');
}.property()
});
答案 1 :(得分:0)
也许
this.store.all("genre") works better for you.
findAll将返回Promise,而不是您想要的记录。 如果你试试
genres.then(function(result){
var genreNames = result.map(function(item, index, enumerable){
return item.get('name');
});
你会得到你的结果。
问题是,它是异步的。 genreNames将是未定义的,而您将返回它。 您可以与观察者一起开始解决此问题。
f.e。
possibleGenres: [],
possibleGenresDidChange: function(){
//code...
this.set("possibleGenres",result);
}.obersves("possibleGenresTrigger"),
possibleGenresTrigger: false,
更新属性,将TriggerState切换为true和false。但它有点难看。我以相同的方式做了一些事情,因为我发现没有更好的解决方案来处理控制器中的异步请求。
但是,就像写在第一行中一样,也许store.all()可以正常工作。
答案 2 :(得分:0)
由于findAll正在返回一个承诺,正如lukkysam所指出的,正确的解决方案是在返回的值上使用then
,如此。
possibleGenres: function() {
var genreNames = [];
this.store.findAll("genre").then(function(genres){
genres.forEach(function(genre){
genreNames.push(genre.get('combinedName'));
});
});
return genreNames;
}.property(),