Ember afterRender组件/非异步AJAX

时间:2014-06-24 17:36:20

标签: ajax ember.js

想象一下呈现HTML表的组件。该表中的数据来自远程JSON。

组件的另一部分依赖于完全呈现的HTML表(使用JSON数据)。

在组件的init事件中,我检索JSON并设置组件用于呈现表的数据。

我无法使用afterRender挂钩来进一步处理表,因为当afterRender被触发时,表存在但没有JSON数据。

我注意到组件外部的afterRender挂钩工作(表完全呈现),但是我通过运行属于组件内部的代码来打破封装。

我可以同步获得JSON,或者也许是承诺中的承诺?我怎么做后者?我的意思是在组件的init钩子上,我如何创建一个仅在返回其中的promise时返回的promise?

或者我怎样才能以Ember方式接近它?

1 个答案:

答案 0 :(得分:0)

你绝对可以脱离你的承诺。

var items = [];

this.set('items', items);

$.getJSON('/colors').then(function(results){
  results.forEach(function(item){
    item.color +=" is pretty";
  });
  return results;
}).then(function(prettyResults){
  prettyResults.forEach(function(item){
    items.pushObject(item);
  });
});

http://emberjs.jsbin.com/OxIDiVU/724/edit

超级深刻的承诺

new Ember.RSVP.Promise(function(resolve){
  resolve($.getJSON('/colors'));
}).then(function(results){   // this isn't hit til the json is returned
  results.forEach(function(item){
    item.color +=" is pretty";
  });
  return new Ember.RSVP.Promise(function(resolve){
    Ember.run.later(function(){
      resolve(results);
    }, 4000);
  });

}).then(function(prettyResults){ // this isn't hit til the 4 second resolve is done
  prettyResults.forEach(function(item){
    items.pushObject(item);
  });
});

http://emberjs.jsbin.com/OxIDiVU/725/edit