根据Ember

时间:2015-08-24 20:30:32

标签: javascript asynchronous ember.js

我在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加载它们?

2 个答案:

答案 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