在Ember组件中异步加载

时间:2014-06-21 15:33:40

标签: ember.js ember-data

我在表单中有一个自动完成组件。插入组件后,我运行此功能:

  setSearchInput: (->
    username = @get 'targetObject.user.username'
    @set('searchInput', username)
  ).on('didInsertElement')

此情况下的targetObject是表单,可以访问与之关联的user内容模型。此时,可能尚未加载user。通常,这会提示Ember-Data查询服务器并返回一个promise。但是,在这种情况下,它不会返回承诺。它返回undefined。但是,如果我强制Ember暂停一秒钟,它会返回预期的结果:

  setSearchInput: (->
    window.setTimeout =>
      username = @get 'targetObject.content.user.username'
      @set('searchInput', username)
    , 1000
  ).on('didInsertElement')

如果我在@set('searchInput', username)上设置断点,我会遇到类似的事情。 username将是未定义的,但如果我此时运行@get 'targetObject.content.user.username',则会返回预期结果。

知道发生了什么事吗? Ember-Data仍然处于测试阶段,所以也许这是一个错误?还有其他人遇到过这种行为吗?

1 个答案:

答案 0 :(得分:2)

我将假设用户在这里是一个belongsTo异步对象(如果不是你需要显示那里有什么内容,因为我不得不猜),我要去在javascript中做(抱歉,如果我在coffeescript中这样做,它可能会让你更加困惑;)

setSearchInput: function(){
  var self = this; 
  this.get('targetObject.user').then(function(user){
    self.set('searchInput', user.get('username'));
  });
}.on('didInsertElement')

示例:http://emberjs.jsbin.com/OxIDiVU/691/edit