Emberjs阵列控制器

时间:2015-05-25 16:03:26

标签: javascript ember.js arraycollection

我的路线是:

export default Ember.Route.extend({
    model: function (params) {
        var blocks = this.store.find('block', {'objectId': 777});
        this.controllerFor("blocks").set('model', blocks);
        return Ember.RSVP.hash({
            object: this.store.find('object', params.id),
            blocks: blocks
        });
        //return this.store.find('object', params.id);
    }
});

我的控制器是:

export default Ember.ArrayController.extend({
    init: function(e){
        alert('jere');
    }
});

init函数中的警报有效,但接下来我收到错误:

  

处理路径时出错:objects.bc.index无法读取属性   '长度' null TypeError:无法读取属性' length'为null

通过ajax获取模型的正确方法是什么,并使用自定义数组控制器在模板中显示?

1 个答案:

答案 0 :(得分:1)

此代码存在许多问题。首先,ArrayController假定其模型是一个数组,而您的model钩子返回一个哈希。其次,您的this.controllerFor("blocks").set('model', blocks)调用会尝试将控制器的模型设置为承诺,这是无用的。您没有像这样在model挂钩中为控制器设置模型。您可以通过返回模型进行设置,然后通过您的(或默认)setupController挂钩将其安装(在解析后)到控制器中。

您不应该使用即将被弃用的ArrayController,而是使用普通的旧控制器。该控制器的模型将是从model钩子返回的哈希值。您需要使用{{model}}在模板中显式访问它。

所以你想要这样的东西:

// route.js
export default Ember.Route.extend({
    model: function(params) {
        var blocks = this.store.find('block', {'objectId': 777});
        return Ember.RSVP.hash({
            object: this.store.find('object', params.id),
            blocks: blocks
        });
    }
});

// controller.js
export default Ember.Controller.extend({
    init: function(e) {
        alert('jere');
    }
});

在模板中,而不是

{{#each controller}}
    blockProp is {{blockProp}}

正如您现在所做的那样,请使用

{{#each block in model.blocks}}
    blockProp is {{block.blockProp}}
{{/each}}
And objectProp is {{model.object.objectProp}}