控制器负载上的Ember负载值

时间:2015-02-01 10:39:51

标签: javascript ember.js ember-data

我正在尝试加载一系列类型,用作选择值。可以使用addSelect操作创建多个选择。这是我加载数据的方式。

genreStrings: function() {
    var array = [];
    this.store.findAll("genre").then(function(genres){
        genres.forEach(function(genre){
            array.push(genre.get('combinedName'));
        });
    });
    return array;
}.property(),

然后它就像在模板中一样使用。

{{view "select" content=genreStrings value=genre.name prompt="Select a Genre" }}

我面临的问题是,当页面加载时加载的第一个选择没有值,而使用addSelect操作添加的每个后续选择都具有预期的值。

我尝试了.on('init'),但这仍然无效。

如何为第一个选择设置这些值?

1 个答案:

答案 0 :(得分:0)

第一次,数组只是空的,因为您使用异步方式加载数据。解决方案可能是创建一个更新genres字段的方法:

  genres: null,

  genreStrings: Ember.computed.map('genres', function(genre) {
    return genre.get('combinedName');
  }).property('genres'),

  genreStrings: function() {
    this.set('genres', []);
    this.store.findAll("genre").then(function(genres) {
      this.set('genres', genres);
    }.bind(this));
  }.on('init')

此外,我已添加Ember.computed.map,将genres转换为所需格式。您仍然可以使用ES5样式:

  genreStrings: function() {
    return this.get('genres').map(function(genre) {
      return genre.get('combinedName');
    });
  }).property('genres'), 

编辑:

如果你想以更多的Ember方式进行,你可以将它移到路线的模型钩子上:

model: function() {
  return this.store.findAll("genre");
}

然后,如果您返回承诺,整个路径将等待您的数据被提取,并且在您的控制器中,您将在model属性中拥有它。