2014-06-24 22 views
0

想象一個呈現HTML表格的組件。表中的數據來自遠程JSON。Ember afterRender組件/非異步AJAX

該組件的另一部分依賴於完全呈現的HTML表(使用JSON數據)。

在組件的init事件中,我檢索JSON並設置組件將用於呈現表的數據。

我不能使用afterRender鉤子來進一步處理表,因爲當觸發afterRender時,表存在但沒有JSON數據。

我注意到組件外部的一個afterRender鉤子工作(表格完全呈現),但是我通過運行屬於組件內部的代碼來破壞封裝。

我可能會同步獲得JSON,或者是承諾內的承諾?我將如何做後者?我的意思是在組件的init掛鉤上,我如何創建一個只有在它內部的promise被返回時纔會返回的promise?

或者我該如何處理這種灰燼方式?

回答

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

+1

有道理,謝謝你教我的東西,我將需要:)不過,我想我只是發現這是一個更好的方法。如果我「觀察」HTML表所依賴的屬性,那麼在觀察者的表內完全呈現,所以我可以做我需要的東西!甜。 – Ivan

+0

伊萬傾聽模型的狀態成爲加載是做的方式(DS.Model#isLoaded),請考慮回答你自己的問題。另請看這篇文章http://blog.trackets.com/2013/01/27/ember-data-in-depth.html。 –