Javascript Ember.js:控制器何时可以访问模型?

Javascript Ember.js:控制器何时可以访问模型?,javascript,ember.js,Javascript,Ember.js,在Ember中,控制器何时可以访问模型 下面是一个简单的Ember应用程序,它有一个静态模型和一个试图在init上访问模型的控制器。您会注意到,在init上,modeltitle属性是undefined。但是,setTimeout说明型号以后可以访问 我的印象是,在模型准备好之前,Ember不会启动控制器。这是正确的吗?Ember文档()指出,在实例化控制器时,即使异步加载,模型也是可用的 App=Ember.Application.create({}); App.IndexRoute=Emb

在Ember中,控制器何时可以访问模型

下面是一个简单的Ember应用程序,它有一个静态模型和一个试图在
init
上访问模型的控制器。您会注意到,在
init
上,model
title
属性是
undefined
。但是,setTimeout说明
型号
以后可以访问

我的印象是,在模型准备好之前,Ember不会启动控制器。这是正确的吗?Ember文档()指出,在实例化控制器时,即使异步加载,模型也是可用的

App=Ember.Application.create({});
App.IndexRoute=Ember.Route.extend({
模型:函数(){
返回岗位[0];
}
});
App.IndexController=Ember.ObjectController.extend({
alertTitle:函数(){
var=这个;
jQuery(“.output”).append(“1.”+this.get(“title”)+“
”);//返回“undefined” setTimeout(函数(){ jQuery(“.output”).append(“2.”+that.get(“title”);//返回正确的标题 }, 1000); }.on(“初始”) }); var员额=[ { id:1, 标题:“第一个标题”, 正文:“我们的啤酒是发酵的。我们的啤酒是发酵的。我们的啤酒是发酵的。我们的啤酒是发酵的。我们的啤酒是发酵的。我们的啤酒是发酵的。我们的啤酒是发酵的。我们的啤酒是发酵的。我们的啤酒是发酵的。我们的啤酒是发酵的 },{ id:2, 标题:“第二个标题”, 正文:“Maecenas faucibus mollis interdum.前庭位于猫咪之门euismod semper.粗犷的odio,舒适的dapibus ac facilisis in,Egesta eget quam.Fusce dapibus,tellus ac cursus commodo,tortor mauris调味品nibh,ut酵素massa justo at amet risus.AENEA eu leo quam.Pellentesque ornare sem Lacina quam venenatis前庭。” } ];
你的印象实际上是错误的。setupController挂钩用于设置控制器上的任何属性,包括模型。实际上,默认情况下,
setupController
所做的一切都是在控制器上设置模型的。这就是为什么如果您重写钩子并且仍然需要设置
模型
时,必须显式地设置模型或调用
this.\u super(controller,model)

请注意setupController的签名:

setupController: function(controller, model)
为了使其工作,控制器必须已经由Ember设置模型的点实例化。初始化是在控制器实例化期间激发的。因此,对
init
的调用发生在
model
设置之前`

对于模型的异步获取,如果模型钩子返回一个承诺,Ember将阻塞,直到一个已履行的承诺可以传递到
setupController
函数中,以便将模型分配给承诺的履行,而不是承诺本身。它可以让您避免打以下电话:

setupController: function(controller, model){  
   var self = this;
   makeAsyncCallReturningPromise().then(function(result){
       self._super(controller, result);
   }
}

这基本上可以完成相同的事情

-是控制器实例化的地方。:)@缩微版啊,我更正了我的帖子。我的意思是在实例化控制器时调用init,这发生在调用
this.setupController(控制器、上下文、转换)之前@sunrize920当模型可用时,控制器内是否存在触发函数的事件?比如“准备就绪”上的
.on
或者类似的东西?在模型可用之前实例化控制器是否有原因?看起来很奇怪,因为控制器依赖于它。只是好奇。你可以有一个函数
。观察('model')
,它可以在模型更改时启动,包括第一次添加它时。您还可以使用
controller.someFunction()
在路由上的setupController内部调用控制器中的函数,您到底想实现什么?您在JSFIDLE中编写的代码根本不是“余烬”,只是学习而已;我没有一个具体的项目或任务,我正试图在这个时候完成,除了通过灰烬指南。我只是把JSFIDLE作为一个简单的例子来说明我的观点。
setupController: function(controller, model){  
   var self = this;
   makeAsyncCallReturningPromise().then(function(result){
       self._super(controller, result);
   }
}