Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ember.js 模型何时连接到控制器?_Ember.js - Fatal编程技术网

Ember.js 模型何时连接到控制器?

Ember.js 模型何时连接到控制器?,ember.js,Ember.js,模型在什么位置连接到控制器?还有,当模型在那里时,有钩子吗 因为我面临以下问题:无法访问模型以使用其中的数据进行一些计算: App.ResultsRoute = Ember.Route.extend({ model: function(){ // LOCAL, blocking call! return {messages : this.store.all('message').toArray()}; } }); App.ResultsContr

模型在什么位置连接到控制器?还有,当模型在那里时,有钩子吗

因为我面临以下问题:无法访问模型以使用其中的数据进行一些计算:

App.ResultsRoute = Ember.Route.extend({
    model: function(){
        // LOCAL, blocking call!
        return {messages : this.store.all('message').toArray()};
    }
});

App.ResultsController = Ember.ObjectController.extend({
    init : function(){
        this._super();
        console.log(this);
        console.log(this.get('model'));
        console.log(this.get('model.messages'));
        this._someComputation();
    },

    _someComputation : function(){
        this.get('model.messages').forEach(function(message){
            //do something
        }
    }
});
这张照片是:

Class { [...] model: messages: Array[58]0: Class1: Class2: [...] Class57: Class length: 58}
null 
null 
因此,基本上我可以在控制台中看到模型,但当在
init
函数中以编程方式访问它时,它不在那里(还没有?)。 或者这是对模型数据进行计算的错误方式(或位置)

编辑:
子路由的控制器可以访问模型,因此这可以作为一种解决方法:

App.ResultsIndexController = Ember.Controller.extend({
    needs: "results",
    parentController : Ember.computed.alias('controllers.results'),

    init : function(){
        console.log("ResultsIndexController created");
        console.log(this.get('parentController').get('model'));
    }
});
印刷品:

ResultsIndexController created
{messages: Array[55]}

但我更希望它位于父控制器中,以便所有子控制器都可以访问它。

它在
setupController
过程中连接,该过程发生在初始化之后的路由中,当模型已解析时。代码基本上如下所示:

App.ResultsRoute = Ember.Route.extend({
    model: function(){
        // LOCAL, blocking call!
        return {messages : this.store.all('message').toArray()};
    },
    setupController: function(controller, model){
      controller.set('model', model);
    }
});
如果您想在
setupController
期间执行此操作,通常会覆盖它以添加其他功能

App.ResultsRoute = Ember.Route.extend({
    model: function(){
        // LOCAL, blocking call!
        return {messages : this.store.all('message').toArray()};
    },
    setupController: function(controller, model){
      this._super(controller, model);
      controller._someComputation();
    }
});

另外,您的模型钩子说这是一个阻塞调用,但您没有返回承诺,因此这不是真的(但可能只是一个复制粘贴foo)

文档声明
store.all()
直接返回
RecordArray
,而
store.find()
返回承诺,所以我假设这是阻塞,但我肯定是错的。如果您将store.find()返回到模型挂钩,它会工作,但如果您返回{foo:store.find()},则不会工作。那它就不会知道这个物体里隐藏着一个承诺。