我有一个商业日历服务,其中某个属性不可用于计算属性,但在方法中可用。
在下面的代码中,在访问计算的 businessYear 属性时,未定义属性日历。另一方面,日历是在调用 year()方法时定义的。
currentYear 属性在别处使用,因此在访问 businessYear 之前调用init()并解析商店承诺。
我调试了这个,开发人员工具显示 this.calenders 是在监视变量中定义的,但在计算属性中仍未定义。它几乎就像计算属性在另一个上下文中执行。我可能错过了一些非常基本的东西,但却没有看到它。
应用程序/服务/业务calendar.js
import Ember from 'ember';
import moment from 'moment';
const { computed, inject: { service }, get, set } = Ember;
const findCalendar = (date, calendars) => {
let p1, p13
return calendars.find(function (item, index, enumerable) {
p1 = moment(get(item, 'p1'));
p13 = moment(get(item, 'p13'));
return moment.range(p1, p13).contains(date);
})
}
export default Ember.Service.extend({
store: service(),
calendars: [],
currentDate: computed(() => {
return moment();
}),
currentYear: computed('currentDate', () => {
return moment(get(this, 'currentDate')).year();
}),
businessYear: computed(() => {
let calendar = findCalendar(moment(), get(this, 'calendars'));
return get(this.calendar, 'year');
}),
init() {
this._super(...arguments);
get(this, 'store').findAll('calendar').then((recs) => {
set(this, 'calendars', recs);
})
},
year(date) {
let d = moment(date);
var calendar = findCalendar(d, get(this, 'calendars’));
return get(calendar, 'year');
}
});
答案 0 :(得分:0)
感谢有关Ember Slack Feed的反馈,问题是在计算属性中使用箭头函数。这会产生一种不同的“这种情况”。或背景。工作代码如下。请注意,即使 currentDate 和 currentYear 计算属性正常工作,也会删除所有箭头函数以保持代码一致性。
import Ember from 'ember';
import moment from 'moment';
const { computed, inject: { service }, get, set } = Ember;
const findCalendar = (date, calendars) => {
let p1, p13
return calendars.find(function (item, index, enumerable) {
p1 = moment(get(item, 'p1'));
p13 = moment(get(item, 'p13'));
return moment.range(p1, p13).contains(date);
})
}
export default Ember.Service.extend({
store: service(),
calendars: [],
currentDate: computed(function() {
return moment();
}),
currentYear: computed('currentDate', function() {
return moment(get(this, 'currentDate')).year();
}),
businessYear: computed(function() {
let calendar = findCalendar(moment(), get(this, 'calendars'));
return get(this.calendar, 'year');
}),
init() {
this._super(...arguments);
get(this, 'store').findAll('calendar').then((recs) => {
set(this, 'calendars', recs);
})
},
year(date) {
let d = moment(date);
var calendar = findCalendar(d, get(this, 'calendars’));
return get(calendar, 'year');
}
});