Ember - 从Ember数据阵列中获取价值

时间:2015-01-30 12:52:32

标签: javascript ember.js ember-data

我试图在控制器中循环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控制器的重要信息?

与以往一样,非常感谢任何帮助。

3 个答案:

答案 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(),