Ember服务中的属性未定义

时间:2017-05-21 19:24:12

标签: ember.js ember-data

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

在下面的代码中,在访问计算的 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');
  }
});

1 个答案:

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