【问题标题】:ember call controller from template模板中的 ember 调用控制器
【发布时间】:2014-10-25 12:15:17
【问题描述】:

我正在使用 Emberjs,但我仍然无法完全了解如何从模板中绑定控制器。

我有一个模型:date_model.js

WebCalendar.Dates = DS.Model.extend({
    today: DS.attr('date'),
    monthNumber: function(){
        var today =  this.get('today');
        return today.getMonth();
    }.property('today'),
    month: DS.attr('date'),
    year: DS.attr('date'),
    daysName: DS.attr('array'),
    daysInMonth: DS.attr('array'),
    weeks: DS.attr('number')
});

WebCalendar.Dates.FIXTURES = [
    {   
        id: 1,
        today: new Date(), 
        month: moment().format('MMM'),
        year: moment().format('YYYY'),
        daysName: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
        daysInMonth: [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ],
        weeks: new Array(6)
    }
];

和两个控制器差不多:) cal_controller.js:

WebCalendar.CalController = Ember.ArrayController.extend({
    itemController: 'days'

});

days_controller.js

WebCalendar.DaysController = Ember.ObjectController.extend({
    getMonthDays: function(){
        var monthNumber = this.get("monthNumber");
        var daysInMonth = this.get("daysInMonth");
        var totDayInMonth = daysInMonth[monthNumber];

        var days = [];
        for( i = 1; i < totDayInMonth; i++){
            days.push(i);
        }
        return days;

    }.property('monthNumber')
});

还有一个模板,cal.hbs:

<table>
        {{#each date in controller}}
            <tr id="year">
                <td>{{date.year}}</td>
            </tr>
            <tr>
                <td id="prev-month"> Prev </td>
                <td id="month">{{date.month}}</td>
                <td id="next-month"> Next </td>
            </tr>

            <tr id="days-of-week">
                {{#each date.daysName}}
                    <td>{{this}}</td>
                {{/each}}
            </tr>

        {{/each}}

    <tbody>



    {{#each date in controller}} 
        {{#each date.weeks}}
            <tr class="days">{{this}}
                {{#each days itemController="days"}}
                    <td>{{days.getMonthDays}} Days</td>
                {{/each}}
            </tr>
        {{/each}}
    {{/each}}

    </tbody>    
</table>

所以我需要遍历我的周模型 (6),然后再次循环思考我的日子并打印它们

我的想法是先在模板中循环,然后在控制器中执行日期,然后在控制器中执行天数,但是 [当然,我需要指定的不是默认的 cal 控制器而是天数控制器,这就是我在 webCal.DaysController 中执行天数的原因 但它抱怨不是一个数组......

错误:

Assertion failed: The value that #each loops over must be an Array. 
You passed WebCalendar.DaysController 

为什么会这样? 为什么如果我说只是在控制器中的几天不会抱怨不是数组控制器??

【问题讨论】:

  • 错误信息是否说明了哪个#each 循环是有问题的循环?我认为问题在于您在控制器中定义 itemController 而不是在应该使用 days 控制器的特定循环上“内联”。试试 {{#each days itemController="days"}}
  • 不,它没有说是哪个循环,但我猜是因为它抱怨 WebCalendar.DaysController 的第一天。无论如何,我尝试了您的建议,现在它不再抱怨了,但它甚至不显示我在#each days 中放入的任何内容

标签: javascript ember.js


【解决方案1】:

我不确定您拥有的数据结构,对于您在模板中尝试执行的操作,周需要是包含天数组的对象。

{{#each date in controller}} 
  {{#each date.weeks}}
    <td>{{this}}
      {{#each days itemController='days'}}
          <td>{{days.getMonthDays}} Days</td>
      {{/each}}
    </td>
  {{/each}}
{{/each}}

更新

可以在DateController 中创建更好的循环结构:

WebCalendar.DateController = Ember.ArrayController.extend({
  formattedWeeks: function() {
    var i;
    var monthNumber = this.get('monthNumber');
    var daysInMonth = this.get('daysInMonth');
    var totDayInMonth = daysInMonth[monthNumber];

    var days = [];
    for (i = 1; i < totDayInMonth; i++) {
      days.push(i);
    }

    var weeks = [];
    var fullWeeks = Math.floor(days.length / 7);

    for (i = 0; i < fullWeeks; i++) {
      weeks.push(days.splice(0, 7));
    }

    weeks.push(days);

    return days;
  }.property('monthNumber', 'daysInMonth')
});

这会给你一个数组,它们有正确的编号,即:

[
   [1,2,3,4,5,6,7],
   [8,9,10,11,12,13,14],
   [15,16,17,18,19,20,21],
   [22,23,24,25,26,27,28],
   [29,30]
]

然后在你的模板中:

{{#each date itemController='date'}} 
  {{#each date.formattedWeeks}}
    <tr>
      {{#each this}}
          <td>{{this}}</td>
      {{/each}}
    </tr>
  {{/each}}
{{/each}}

PD:未经测试

【讨论】:

  • 其实我也不确定我的数据结构。现在我用您的解决方案(它有效)和更好的表结构更新了我的模板,并且不再有效。错误:无法读取 null 的属性“firstChild”。无论如何,我的想法是创建一个包含 6 个点的星期数组并循环它以创建 6 行,然后在循环内直到 7(这部分还没有),然后插入包含一个月中所有天数的天数数组。如果你有更好的结构我很高兴知道,看来你对 Emberjs 很了解 :)
  • 我更新了答案,可能不是你所需要的,但应该给你一个想法@GiorgiaSambrotta
  • 啊!这是完全有道理的。是更一般的思考方式。我喜欢!这样做,我什至不需要创建 daysController.ObjectController 作为 CalController 的 itemController。我的 CalController 成为 DateController。我会测试它并让你知道:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-18
  • 1970-01-01
  • 2013-03-28
  • 1970-01-01
相关资源
最近更新 更多