模型何时连接到控制器?

时间:2014-08-24 16:59:20

标签: ember.js

模型连接到控制器的哪一点?并且,当模型出现时是否有钩子?

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

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]}

但我宁愿在父控制器中使用它,以便所有孩子都可以访问它。

1 个答案:

答案 0 :(得分:1)

它在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)< / p>