У меня есть модель order, для которой я собираю данные в многостраничной форме. Я создал несколько таких проверок:

const Validations = buildValidations({
  // these should only be used when we’re on checkout.info route
  name: validator('presence', true),
  email: [
    validator('presence', true),
    validator('format', { type: 'email' })
  ],
  // these should only be used when we’re on checkout.shipping route
  address1: validator('presence', true),
  address2: validator('presence', true),
  city: validator('presence', true),
});

Моя модель настроена на их использование следующим образом:

export default Model.extend(Validations, {
  // model set-up in here
})

Я бы хотел, чтобы он проверял только name и email, когда я использую checkout.info, и проверял address1, address2 и city когда я на checkout.shipping.

Одна из вещей, которые я уже пробовал, - это запускать проверки внутри моего компонента checkout-form:

let { m, validations } = order.validateSync({
  on: ['name', 'email']
})
const isValid = validations.get('isValid')
order.set('didValidate', isValid)

Проблема в том, что это, похоже, не разблокирует отключенное состояние следующей кнопки моей формы.

{{next-button disabled=(v-get model.order 'isInvalid')}}

Еще я попытался создать собственный валидатор routed-presence, который отключает presence, когда он не находится на текущем маршруте. Проблема в том, что другие валидаторы все равно будут блокировать это (например, тип или длину).

Как я могу добиться этого?

0
gosseti 27 Июл 2017 в 09:51

1 ответ

Лучший ответ

Хотя это плохо документировано, вы можете включать или отключать проверки в зависимости от условия, которое рассчитывает ваша модель:

import { validator, buildValidations } from 'ember-cp-validations';

export default Ember.Object.extend(buildValidations({

  email: {
    disabled: Ember.computed.alias('model.isCheckoutPage'),
    validators: [
      ...
    ],
  }
}), {
  // could be a computed property too
  isCheckoutPage: false,
});
1
acorncom 30 Июл 2017 в 00:03
Большое спасибо! Как мне передать текущую информацию о маршруте в мою модель? Например, возможность проверить что-то вроде computed.equal('model.currentPath', 'checkout.shipping')?
 – 
gosseti
30 Июл 2017 в 08:18
Я добавил step: attr('string') в свою модель order. В моем компоненте checkout-form я выполняю this.get('model.order').setProperties({ step: this.get('router.currentPath') }), а затем disabled: !computed.equal('model.step', 'checkout.shipping') внутри своих проверок. Хотя, похоже, это не работает ... что-нибудь из того, что я сделал, явно неправильно?
 – 
gosseti
30 Июл 2017 в 10:34
1
Поверьте, вам нужно использовать второе вычисляемое свойство disabled: computed.not() или настраиваемое вычисляемое свойство, я не думаю, что вы можете отрицать, как вы делаете ...
 – 
acorncom
30 Июл 2017 в 15:52