Ember.js - 子嵌套视图的控制器

时间:2013-03-07 17:07:31

标签: view controller ember.js

我正在用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顶部显示一个弹出窗口。

1 个答案:

答案 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 });

注意:我自己还没有使用控件助手,但这应该是它的工作方式。