我正试图将我的应用程序移动到使用"outlet"的新Emberjs路由器组件。
参考文献:http://emberjs.com/guides/outlets/并且这个:http://codebrief.com/2012/07/anatomy-of-an-ember-dot-js-app-part-i-redux-routing-and-outlets/
我如何理解这一点:当你使用字符串连接插座时,会发生以下情况
- Ember在应用程序上查找视图定义并对其进行实例化
- Ember在应用程序上查找控制器定义并创建其实例
- 像这样将两者挂钩:设置视图控制器属性和设置控制器视图属性
---工作良好,直到最后一步。我似乎无法在控制器上设置视图属性。
JSBin在此:http://jsbin.com/ekekir/40/edit
相关代码:
应用程序路由器
App.Router = Ember.Router.extend({
root: Ember.Route.extend({
state1: Ember.Route.extend({
route: '/state1',
connectOutlets: function (router) {
router.get('applicationController').connectOutlet('state1')
}
})
})
});
控制器和视图
App.State1View = Ember.View.extend ({
templateName: 'state1',
submit: function () {
this.get('controller').doLogView();
return false;
}
});
App.State1Controller = Ember.Controller.extend({
doLogView: function () {
console.log('Getting controller view:');
console.log(this.get('view'));
}
});
最后,它返回一个大的胖null。
我是做错了什么,还是应该这样?
BTW:这是使用ember-1.0版本的
Mike Aski认为控制器不应该知道视图是正确的。
然而,当前的实现实际上确实设置了控制器上的视图,而不是您期望的控制器。在上面的示例中,applicationController
的view
属性将设置为State1View
的实例。
Ember的相关代码来源:
https://github.com/emberjs/ember.js/blob/master/packages/ember-views/lib/system/controller.js#L140
这是一种正常行为,因为控制器不必知道呈现其内容的视图。你会有一个依赖循环(和一个破碎的设计…)
依赖关系遵循以下链条:V->C->M
此外,控制器被注入一次,每次显示时都会创建视图。