在操作中更改控制器属性不会更改视图

时间:2015-12-09 17:55:11

标签: ember.js

我是余烬中的新手,我遇到了问题。关键是我需要创建一个应用程序,几乎每个页面都依赖于选定的月份和年份,所以我决定将该属性放在应用程序控制器中并渲染到应用程序模板。现在我有:

应用程序控制器:

    App.ApplicationController = Ember.Controller.extend({
    date: new Date(),
    current_date: function() {
        var d = this.get('date');
        var date = '01';
        var month = d.getMonth() + 1;
        var year = d.getFullYear();

        return {
            date: date,
            month: month,
            year: year
        };
    }.property('date'),

    actions: {
        previousMonth: function() {
            var date = this.get('date');
            date.setMonth(date.getMonth() - 1);
            this.set('date', date);
            console.log(this.get('date'));
        },
        nextMonth: function() {
            var date = this.get('date');
            date.setMonth(date.getMonth() + 1);
            this.set('date', date);
            console.log(this.get('date'));
        }
    }
});

应用程序视图:

 App.ApplicationView = Ember.View.extend({
    date: function() {
        var raw_date = this.get('controller.current_date');
        return raw_date.month + " " + raw_date.year;
    }.property('controller.current_date')
});

和application.js.emblem

.date_selector
    h2#month
        a click="previousMonth" href="#" prev
        current_date
        a click="nextMonth" href="#" next
outlet

默认渲染是可以的。但是当我点击下个月或上个月没有任何变化,但控制台显示该值实际上已经改变。我错过了什么吗?

3 个答案:

答案 0 :(得分:1)

由于new Date()不是Ember对象,因此当您调用date.setMonth时,Ember不知道它已更改。您可以尝试通过调用this.notifyPropertyChange('date')手动触发属性更改,然后您不需要再次调用this.set('date', date)

例如:

previousMonth: function() {
    var date = this.get('date');
    date.setMonth(date.getMonth() - 1);
    this.notifyPropertyChange('date');
    console.log(this.get('date'));
}

或者,如您所见,您可以创建一个new Date()对象并将其设置为当前date属性。

previousMonth: function() {
    var date = this.get('date');
    date.setMonth(date.getMonth()-1);
    this.set('date', new Date(date));
    console.log(this.get('date'));
}

答案 1 :(得分:0)

好的,发现了一个问题。原因是date.setMonth和this.set(' date',date)不算作属性的变化。我猜它认为它仍然是同一个对象并且没有更新。解决方案是根据日期数据创建新的Date变量,并通过this.set设置它(' date',new_variable)。我仍然认为这很奇怪。

答案 2 :(得分:0)

由于toString()的{​​{1}}功能,我认为它没有更新。

请参阅此示例here

date object。这就是为什么Ember无法更新模板

的原因