Ember服务 - 为应用程序

时间:2015-06-12 11:59:18

标签: ember.js

我的应用有很多报道,而且我总是有 dateBegin dateEnd

理想的行为是:

  • app首次加载, dateBegin =月开始(jun-01)/ dateEnd =今天(jun-11)
  • 当用户更改日期时(让我们说mai-01 / mai-31),所有控制器都会获得新日期

我现在的代码:



// app/services/defaults.js

import Ember from 'ember';

export default Ember.Service.extend({
  init: function () {
    this._super();
    var dateEnd = moment().format('YYYY-MM-DD');
    var dateBegin = moment().startOf('month').format('YYYY-MM-DD'));
    
    if (!this.get('dateEnd')) { this.set('dateEnd', dateEnd); }
    if (!this.get('dateBegin')) { this.set('dateBegin', dateBegin }
  }
});






// app/components/select-dates-in-reports.js

import Ember from 'ember';

export default Ember.Component.extend({

  defaults: Ember.inject.service(),

  displayDateBegin: null,
  displayDateEnd: null,
  dateBegin: Ember.computed.alias('defaults.dateBegin'),
  dateEnd: Ember.computed.alias('defaults.dateEnd'),

  setInitialParams: Ember.on('init', function () {
    this.set('displayDateBegin', this.get('dateBegin'));
    this.set('displayDateEnd', this.get('dateEnd'));
  }),

  actions: {
    chooseParams: function () {
      this.set('dateBegin', this.get('displayDateBegin'));
      this.set('dateEnd', this.get('displayDateEnd'));
    }
  }
});






// app/mixins/query-params-for-reports.js

import Ember from 'ember';

export default Ember.Mixin.create({
  queryParams: ['dateBegin', 'dateEnd'],

  defaults: Ember.inject.service(),

  dateBegin: Ember.computed.alias('defaults.dateBegin'),
  dateEnd: Ember.computed.alias('defaults.dateEnd')
});






// app/mixins/routes-query-params-for-reports.js

import Ember from 'ember';

export default Ember.Mixin.create({
  queryParams: {
    dateBegin: {
      refreshModel: true
    },
    dateEnd: {
      refreshModel: true
    }
  },

  model: function(params) {
    return this.store.find(this.get('modelName'),
      {
        dateBegin: params.dateBegin,
        dateEnd: params.dateEnd
      }
    );
  }
});




在每个控制器初始化后,它按预期工作:

  • 用户输入应用程序,然后访问controller1。 dateBegin = jun-01 / dateEnd = jun-11
  • 在同一个控制器1上,用户将日期更改为 dateBegin = mai-01 / dateEnd = mai-31
  • 用户访问controller2。 这是问题。日期设置为 dateBegin = jun-01 / dateEnd = jun-11
  • 在同一个控制器2上,用户将日期更改为 dateBegin = apr-01 / dateEnd = apr-30
  • 用户再次访问controller1 现在可行。日期设置为 dateBegin = apr-01 / dateEnd = apr-30

我尝试了所有可以在网上找到的东西。 创建初始化器,使用localStorage等。没有任何作用。

任何人都可以帮助我吗? 谢谢!

1 个答案:

答案 0 :(得分:0)

Ember Dependency Injection to the rescue!

您可以创建单个对象来保存日期:

App.SelectedDates = Ember.Object.extend({
  dateBegin: null,
  dateEnd: null // or whatever value you want...
});

然后,将该对象注入ALL控制器,如下所示:

Ember.Application.initializer({
  name: 'register-global-dates',
  initialize: function(container,app) {
    app.register('my:globalDate', App.SelectedDates.create(), {
      singleton: true,
      instantiate: false
    });
    app.inject('controller', 'dateglobal', 'my:globalDate');
  }
});

现在,在你的控制器中,你可以这样做:

this.dateglobal.set('dateBegin', '2015/01/12');

它是所有控制器中的相同对象。

我希望我能正确理解你的问题,这就是解决方案......