1

我正在用 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 顶部显示一个包含额外信息的弹出窗口。

4

1 回答 1

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

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

于 2013-03-07T17:15:09.083 回答