2

我有一条使用星期几找到一天对象的路线

//assume I have a configuration model for 7 days (1 for each week day basically)
var day_of_week = ev.date.getDay() + 1;
var model = App.Day.find(day_of_week);
model.set('date', selected_date); //selected_date is mm/dd/yyyy (input from user)
router.transitionTo('day', model);

在该路线中,我重定向到另一个知道相关对象的路线

App.DayRoute = Ember.Route.extend({
    redirect: function() {
        this.transitionTo('appointments');
    },
    serialize: function(model) {
        return {day_date: model.get('date')};
    }
});

在那个模板中,我每个人都在对象上

{{#each appointment in controller}}
  {{appointment}}<br />
{{/each}}

这是一个基本的计算属性

appointments: function() {
  //do stuff in here
}.property()

我注意到的是,当我第一次加载时,我的计算属性(在上面显示的堆栈的最底部)被调用,就像它应该的那样。但是当我回到那天我无法让计算属性触发(假设因为它是一个已经加载/缓存在内存中的模型)。

我需要重新加载它,因为我确实更改了日期(即使对象的其余部分完全相同)。

当日期更改时,如何强制重新渲染/又名停止缓存的属性?我试图修改属性以在日期更改但仍然没有骰子时触发...

appointments: function() {
  //do stuff in here
}.property('date')

更新 - 显示带有计算属性的完整模型

我的约会计算属性(如上所示)实际上挂在我的模型上(因为它是基于日模型的配置)

App.Day = DS.Model.extend({
    times: [],
    first: attr('string'),
    last: attr('string'),
    interval: attr('number'),
    day_of_week: attr('number'),
    date: attr('string'),
    listings: function() {
        return App.Appointment.find(this);
    }.property(),
    slots: function() {
        var slots = App.Slot.find(); //this returns configuration -not persisted data from $.ajax)
        for(var i = 0; i < slots.get('length'); i++) {
            if (slots.objectAt(i).get('day_of_week') === this.get('day_of_week')) {
                var slot = slots.objectAt(i);
                slot.set('day', this);
                this.get('times').push(slot);
            }
        }
        return this.get('times');
    }.property(),
    appointments: function() {
        App.Appointment.clear(); //just resets this js array each time to get a fresh apt collection (again -because it's dynamic based on configuration)
        var slots = this.get('slots');
        var interval = this.get('interval');
        for(var i = 0; i < slots.get('length'); i++) {
            var entry = App.AppointmentFactory.create(slots.objectAt(i), interval);
            App.Appointment.add(entry);
        }
        return this.get('listings');
    }.property()
});

再次更新

看起来我忘了显示约会索引路线 - 非常重要,因为它显示了我如何填充给定日期模型的约会数组

App.AppointmentsIndexRoute = Ember.Route.extend({
    model: function(params) {
        var day = this.modelFor("day");
        return day.get('appointments');
    }
});
4

2 回答 2

1

我认为您需要为此包括在内@each,如果date每次约会都出现事实上,并且您的 computedProperty 处于该appointments级别。

或者,您可以使用 来防止缓存.volatile(),但正确定义的观察者不需要这样做。

于 2013-05-07T02:00:31.343 回答
1

找到答案的方法是查看里面的代码,appointments以找到您正在使用哪些属性进行了更改以及应该使用哪些属性来重新计算该appointments属性

于 2013-05-07T15:15:28.690 回答