Ember:在验证函数中使用this.get()

时间:2016-11-07 07:58:40

标签: javascript ember.js this

我有一个输入字段的日期验证器:

export default Ember.Component.extend({
moment: Ember.inject.service(),
dateValidation: [{
    message: 'invalid date',
    validate: function(inputDate) {
      if (!inputDate) {
        return true; //allow empty date
      }
      return this.get('moment').moment(inputDate, 'YYYY-MM-DD', true).isValid();
    }
  }],
});

我使用ember-moment验证日期。通常我使用this.get('moment').moment(...)但未定义函数this.get()get()函数未定义,因为this引用验证器函数,而不是ember组件,哪个有get()功能)。 我知道this指的是函数而不是我的组件,但我该如何解决呢?使用Ember.get()并不适合我。

我正在使用ember-paper,而paper-input有一个customValidations属性,必须是一个数组(在我的情况下是dateValidation)

e.g:

{{paper-input
   type="date"
   value=atDate
   onChange=(action (mut atDate))
   customValidations=dateValidation}}

2 个答案:

答案 0 :(得分:0)

  1. 第一个选项如评论中提到的@vothaison,您可以将this引用传递给验证方法。

  2. 您可以在对象定义中注入moment

    export default Ember.Component.extend({
    moment: Ember.inject.service(),
    dateValidation: [],
    init() {
        this._super(...arguments);
        var objectValidation = {
            message: 'invalid date',
            myMoment: this.get('moment'),
            validate: function(inputDate) {
                if (!inputDate) {
                    return true; //allow empty date
                }
                return this.get('myMoment').moment(inputDate, 'YYYY-MM-DD', true).isValid();
            }
        };
        this.get('dateValidation').pushObject(objectValidation);
    }
    

    });

答案 1 :(得分:0)

我无法对此进行测试,但是一个简单的bind看起来应该可以解决问题:

export default Ember.Component.extend({
moment: Ember.inject.service(),
dateValidation: [{
    message: 'invalid date',
    validate: function(inputDate) {
      if (!inputDate) {
        return true; //allow empty date
      }
      return this.get('moment').moment(inputDate, 'YYYY-MM-DD', true).isValid();
    }.bind(this)
  }],
});