每次从属密钥更改时都不会执行ember-cp-validation

时间:2017-03-03 11:27:32

标签: ember.js ember-cp-validations

让我分享一下我在很久以前偶然发现并在今天修复的问题。

问题描述:

每次更改相关密钥时都不会执行验证程序。

我的自定义验证程序检查custom-meta 的唯一性定义如下:

import BaseValidator from 'ember-cp-validations/validators/base';
import Ember from 'ember';
const {isEqual} = Ember;

export default BaseValidator.extend({

  /**
   * Validates custom-metas of the {spot} model.
   * The validation leans upon duplicates detection of the 'key' property values.
   * @example:
   * spot.set('customMeta', [{key: 'duplicate'}, {key: 'duplicate'}]);
   * spot.get('validations.attrs.customMeta.isValid') -> false
   * spot.set('customMeta', [{key: 'unique 1'}, {key: 'unique 2'}]);
   * spot.get('validations.attrs.customMeta.isValid') -> true
   * ...skipping rest of the doc...
   */
  validate(value, options, spot) {

    const customMetaKeys = spot.get('customMeta').mapBy('key');

    if(isEqual(customMetaKeys.get('length'), customMetaKeys.uniq().get('length'))){
      return true;
    }

    return this.createErrorMessage('unique-custom-meta-keys', value, options);
  }

});

验证程序执行完全两次,尽管依赖关键字更改频繁。我认为问题可能来自model-fragments插件或观察者,它是在与其他功能相关的相同条件下触发的。

这是我的验证声明:

const Validations = buildValidations({
  customMeta: {
    description: 'Custom-metas',
    validators: [
      validator('unique-custom-meta-key', {
        dependentKeys: ['customMeta.@each.key'],
        debounce: 500
      })
    ]
  }
});

和模型定义:

export default Model.extend(Validations, {
  customMeta : fragmentArray('custom-meta')
});

1 个答案:

答案 0 :(得分:1)

解决方案:

在查看ember-cp-validation代码后,我发现在声明依赖于集合中多个值的验证器方面存在差异:

dependentKeys: ['model.friends.@each.name']

正如您所看到的,依赖键声明中的model属性可以解决问题。现在他们的online doc提供了一个正确的声明,当时我第一次偶然发现问题时并非如此。

dependentKeys: ['model.customMeta.@each.key'],

非常愚蠢的错误,但也许这个帖子可以节省某人的一天; - )