EmberJS - 控制器的奇异行为检索模型

时间:2014-09-02 16:21:32

标签: javascript ember.js ember-cli

我也在discuss.emberjs.com上发布了这个,但试图看看这里是否有人知道解决方案。所以我试图从ArrayController中检索模型但由于某种原因我无法检索它,因为它给了我未定义/空数组。

在ArrayController中的init函数中,我有以下内容:

init: function(){
    this._super();
    console.log(this);
    console.log(this.content);
    console.log(this.get('content'));
    console.log(this.model);
    console.log(this.get('model'));
}

“this.content”和“this.model”评估为未定义。两个.get()都返回一个空数组。但奇怪的是“console.log(this);”打印以下内容:

Class {_subControllers: Array[0], toString: function, __ember1409674198526: "ember453", 
    __ember_meta__: Object, constructor: function…}
    __ember1409674198526: "ember453"
    __ember_meta__: Object
    __nextSuper: undefined
    _qpDelegate: function (controller, prop) {
    _subControllers: Array[0]
    model: Class
        __ember1409674198526: "ember392"
        __ember_meta__: Object
        __nextSuper: undefined
        content: Array[8]
        isLoaded: true
        isUpdating: false
        store: Class
        toString: function () { return ret; }
        type: my-app-v3@model:suit:
        __proto__: Object
    toString: function () { return ret; }
    __proto__: Object

所以“this”在model->内容(8个元素的数组)下有我需要的模型。我真的很困惑,为什么我只是访问“this”的内部元素时会遇到这些错误。

任何人都知道为什么会发生这种奇怪的行为?

作为参考,我使用的是Ember-CLI(0.0.42)。

2 个答案:

答案 0 :(得分:2)

您可能正在使用控制器的init方法进行记录,我不相信这是推荐的模式。

通常,您在setupController的{​​{1}}挂钩中操纵控制器。此时,保证控制器的模型已经解决,您应该可以通过Route访问它。

答案 1 :(得分:1)

要解决您的问题,请尝试以下方法:

    App.IndexController = Ember.ArrayController.extend({
        init: function () {
            this._super();
            var that = this;
            Ember.run.next(function () {
                console.log(that);
                console.log(that.get('model'));
            });
        }
    });

对于此异常的技术说明,请注意console.log()在调用时并未将对象真正字符串化为其状态。相反,它会记住对象的引用,允许您“探索”#34;它是动态的。但是,该对象保持不变,对其的任何更改都会反映在控制台中。

因此,在调用init()时,this引用确实没有model属性。这就是为什么console.log(this.model)什么都不产生的原因。但是,在init之后立即填充模型。因此,当您检查控制台时,您可以在缓存的this引用中看到它。

要确认这一点,请在console.log调用之后设置一个断点,并在暂停时检查控制台输出。模型属性不会存在。