我是余烬中的新手,我遇到了问题。关键是我需要创建一个应用程序,几乎每个页面都依赖于选定的月份和年份,所以我决定将该属性放在应用程序控制器中并渲染到应用程序模板。现在我有:
应用程序控制器:
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
默认渲染是可以的。但是当我点击下个月或上个月没有任何变化,但控制台显示该值实际上已经改变。我错过了什么吗?
答案 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)