我在Ember中遇到异步加载模型的问题。我以为我已经理解了整个"背景Ember魔法",但我没有。
我有两个模型,让我们说foo和boo这些属性:
foo:category: DS.belongsTo("boo", { async: true })
boo color: DS.attr("string")
在我的路线中,我加载了所有foo
s:
model: function(params) {
return this.store.findAll("task", "");
},
比我的模板中我渲染一个组件:{{my-component model=model}}
。在组件的代码中,我需要将模型转换为另一种形式,所以我有:
final_data: function() {
this.get("model").forEach(function(node) {
console.log(node.get("category"));
});
return {};
}.property("model"),
当我尝试访问"类别"在模型中,我的代码崩溃了:
EmberError@http://localhost:4200/assets/vendor.js:25705:15
ember$data$lib$adapters$errors$$AdapterError@http://localhost:4200/assets/vendor.js:69218:7
ember$data$lib$adapters$rest$adapter$$RestAdapter<.handleResponse@http://localhost:4200/assets/vendor.js:70383:16
ember$data$lib$adapters$rest$adapter$$RestAdapter<.ajax/</hash.error@http://localhost:4200/assets/vendor.js:70473:25
jQuery.Callbacks/fire@http://localhost:4200/assets/vendor.js:3350:10
jQuery.Callbacks/self.fireWith@http://localhost:4200/assets/vendor.js:3462:7
done@http://localhost:4200/assets/vendor.js:9518:1
.send/callback@http://localhost:4200/assets/vendor.js:9920:8
在我看来,就像Ember没有加载boo
一样。我应该如何访问它们以使Ember加载它们?
答案 0 :(得分:0)
它正在尝试加载category
,但适配器遇到了一些错误。无法说出你的例子中的内容。
检查您的网络标签。
答案 1 :(得分:0)
当您从模板访问异步关联时,Ember知道该怎么做。从代码(例如组件的逻辑)开始,Ember不知道它需要检索关联,直到您尝试get
它为止。 get
将触发加载,但会返回一个承诺。你可以这样做:
get_final_data: function() {
Ember.RSVP.Promise.all(this.get("model") . map(node => node.get('category'))
.then(vals => this.set('final_data', vals));
}
我确信你可以看到,这会为每个节点的类别创建一个promise数组,调用Promise.all
等待它们全部完成,然后将结果存储到final_data
属性中。
注意,这不是计算属性;它是一个必须在某个时刻调用的函数/方法,可能在afterModel
。