我正在用Ember构建一个简单的日历应用程序。我的观点以这种方式嵌套:
<script type="text/x-handlebars" data-template-name="calendar">
{{content.monthAsString}}
{{#each day in content.days}}
{{view App.DayView contentBinding="day"}}
{{/each}}
</script>
<script type="text/x-handlebars" data-template-name'="calendarDay">
{{content.date}}
</script>
我的JS代码:
App.CalendarController = Ember.ObjectController.extend({
content:App.Calendar.create(...);
oneDayHover:function(day){
}
});
App.CalendarView = Ember.View.extend({
templateName:"calendar"
});
App.CalendarDayController = Ember.ObjectController.extend({
dayHOver:function(){
//???? HOW TO ACCESS CalendarController?????
}
});
App.CalendarDayView = Ember.View.extend({
templateName:"calendarDay",
init:function(){
this._super();
this.set('controller', App.CalendarDayController.create());
},
mouseEnter:function(){
this.get('controller').dayHover();
}
});
问题1: 有没有比覆盖视图的init方法更好的解决方案来设置它的控制器?
问题2: 如何从CalendarDayController访问CalendarController的oneDayHover?
提前感谢您的帮助
更新1: 我应该注意那些控制器存在于同一状态。 mouseenter的要点是在包含额外信息的CalendarDayView顶部显示一个弹出窗口。
答案 0 :(得分:1)
1 - 不要手动将控制器分配给视图。让Ember做重的提升!看看Embers Router API /如何定义路线。路由将连接控制器和视图并呈现它们(Doc)。
2 - 如果您遵循第1点,使用Embers依赖注入方式可以轻松解决您的其他问题:
App.CalendarDayController = Ember.ObjectController.extend({
needs : ["calendar"],
dayHOver:function(){
//Access the single instance of CalendarController
var calendarController = this.get("controllers.calendar");
}
});
更新以回复评论:
CalendarRoute是隐式创建的。因此,您需要做的就是修改模板,我想:
<script type="text/x-handlebars" data-template-name="calendar">
{{content.monthAsString}}
{{#each day in content.days}}
{{control "calendarDay" day}}
{{/each}}
</script>
如您所见,我建议使用 {{control}} 帮助器。上面的代码基本上是说:
“亲爱的Ember,请使用名称'calendarDay'进行查找 App.CalendarView和App.CalendarDayController并使用它们进行渲染 对象日“
另外你必须告诉ember,它应该不要将控制器用作单例(这是默认行为):
App.register('controller:calendarDay', App.CalendarDayController, {singleton: false });
注意:我自己还没有使用控件助手,但这应该是它的工作方式。