属性 在 Ember 服务未定义

Property in Ember Service undefined

我有一个业务日历服务,其中 属性 对计算的 属性 不可用,但在方法中可用。

在访问计算的 businessYear 属性 时,未定义 属性 calendars 下面的代码.另一方面,calendars 是在调用 year() 方法时定义的。

currentYear 属性 在其他地方使用,因此调用 init() 并在 businessYear 之前解决存储承诺访问过。

我已经对此进行了调试,开发人员工具显示 this.calenders 已在监视变量中定义,但在计算的 属性 中仍未定义。这几乎就像计算的 属性 正在另一个上下文中执行。我可能遗漏了一些非常基本的东西,但就是看不到它。

app/services/business-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');
  }
});

感谢对 Ember Slack 提要的反馈,问题是在计算属性中使用了箭头函数。这会创建一个不同的 'this' 或上下文。工作代码如下。请注意,即使 currentDatecurrentYear 计算属性在工作,所有箭头函数都被删除以保持代码一致性。

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');
 }
});