Привязать к событию ошибки модели, созданной collection.create ()? - PullRequest
4 голосов
/ 20 декабря 2011

У меня есть коллекция комментариев и представление, которое используется для создания новых комментариев.Каждый комментарий имеет свою клиентскую проверку:

class Designer.Models.Comment extends Backbone.Model

  validate: (attrs) ->
    errors = []

    # require presence of the body attribte
    if _.isEmpty attrs.body
      errors.push {"body":["can't be blank"]}

    unless _.isEmpty errors
      errors

Коллекция комментариев очень проста:

class Designer.Collections.Comments extends Backbone.Collection
  model: Designer.Models.Comment

Я создаю комментарии в представлении NewComment.Это представление имеет доступ к коллекции комментариев и использует ее для create новых комментариев.Тем не менее, проверки в модели Comment не проходят через коллекцию.Есть ли способ сделать это с помощью теста?

class Designer.Views.NewComment extends Backbone.View
  events:
    'submit .new_comment' : 'handleSubmit'

  initialize: ->
    # this is where the problem is. I'm trying to bind to error events
    # in the model created by the collection
    @collection.bind 'error', @handleError

  handleSubmit: (e) ->
    e.preventDefault()
    $newComment = this.$('#comment_body')

    # this does fail (doesn't hit the server) if I try to create a comment with a blank 'body'
    if @collection.create { body: $newComment.val() }
      $newComment.val ''
    this

  # this never gets called
  handleError: (model, errors) =>
    console.log "Error registered", args

1 Ответ

3 голосов
/ 20 декабря 2011

Проблема в том, что событие коллекции, которое объединяет все события модели, еще не подключено. Это происходит в функции _add(). Поскольку валидация завершается неудачей до добавления модели, событие не появляется.

Единственный признак сбоя происходит, когда create возвращает false, но похоже, что вы уже поняли это.

Если вам нужны ошибки проверки, вам нужно найти способ сообщить вам об ошибках.

Один из способов - отключить сообщение EventAggregator внутри валидатора. Другой способ - обойти или переопределить функцию Collection.create, чтобы перехватить событие ошибки в модели.

Как то так?

model = new Designer.Models.Comment()
model.bind "error", @handleError
if model.set body: $newComment.val()
    model.save success: -> @collection.add(model)
...