Проверка на стороне клиента в коллекции Backbone.js - PullRequest
3 голосов
/ 23 февраля 2012

Я использую гем backbone-on-rails и получил следующее:

Модель

class Crayons.Models.Color extends Backbone.Model
  validate: (attrs) ->
    if attrs.colorname.length == 0 
      return "colorname can't be empty"

Коллекция

class Crayons.Collections.Color extends Backbone.Collection
  url: '/api/colors'

коллекция создается в роутере

  initialize: ->
    @collection = new Crayons.Collections.Color()
    @collection.fetch()

Методы в ColorIndex

  createCrayonId: (event) ->
    event.preventDefault()
    val = new Crayons.Models.Color()
    val.on("error", @errorHandling);
    val.set(colorname: $('#new_color_name').val())
    @collection.create colorid: val.get("colorname");
    $('#new_color')[0].reset()

  errorHandling: (model, event) ->
    alert(event)

У меня есть простая проверка, которая показывает предупреждение, когда длина равна нулю. Однако после окна предупреждения элементы все еще добавляются в коллекцию из-за @collection.create colorid: val.get("colorname");

Что я могу сделать, чтобы предотвратить добавление в коллекцию результатов при обнаружении ошибки?

Update1 Краткосрочное решение приведено ниже, и оно работает, но я не уверен, правильно ли это делать

ok = val.set(colorname: $('#new_video_url').val())
if ok
  @collection.create colorname: val.get("colorname");

Update2

class Crayons.Collections.Colors extends Backbone.Collection
  url: '/api/videos'
  model: new Crayons.Models.Color()
  validate: (attrs) ->
    if attrs.colorname.length == 0 
      return "colorname can't be empty"

Правильный путь Функция проверки должна присутствовать в модели, а функция, которая предупреждает об ошибке, должна быть инициализирована в модели.

class Crayons.Models.Color extends Backbone.Model
  initialize: -> 
    this.bind("error", @errorHandling)

  errorHandling: (model, event) ->
    alert(event)

  validate: (attrs) ->
    #your error validation goes here

Теперь метод в индексе довольно прост

  createCrayonId: (event) ->
    event.preventDefault()
    @collection.create colorname: $('#new_color_name').val()

1 Ответ

2 голосов
/ 23 февраля 2012

Ваша проверка запускается для цветовой модели, но не для модели коллекции. Поэтому, если вы хотите сделать это чистым способом, вы должны добавить проверку для модели коллекции, чтобы проверить, является ли colorId действительным, то же самое в обновлении с videoid.

Вы можете установить свойство модели коллекции, и при создании / сохранении модели коллекции она будет использовать проверку этой модели, чтобы определить, должна ли она создавать / сохранять модель или нет

...