Коллекция Backbone.js не выбирает недопустимые модели - PullRequest
0 голосов
/ 04 октября 2011

Я добавил проверку для Модели и Коллекции, чтобы не получать модели, которые не действительны.(Кстати, я использую coffeescript, поэтому примеры приведены в coffeescript)

Кто-нибудь знает решение для этого?Следующее не работает

collection = new UserCollection

collection.fetch({
  silent: true
  success: ->
    console.log('collection.models:', collection.models)
})

ОБНОВЛЕНИЕ 1

У меня много пользователей без номера мобильного телефона.

Коллекция пользователей:

class UserCollection extends Backbone.Collection

  url: ->
    app.routes.users_url

Модель пользователя:

class User extends Backbone.Model

  idAttribute: '_id'

  defaults: {
    "email": null
    "mobile": null
    "loc": null
  }

  url: ->
    app.routes.users_url + '/' + (@id || '')

  validate: (attrs) ->
    if !attrs.email
      return "Email address must be provided"
    if !attrs.name
      return "Name must be provided"
    if !attrs.mobile
      return "Mobile number must be provided"
    if @isNew() and attrs.password != undefined
      if !attrs.password
        return "Password must be provided"
      if attrs.password != attrs.password_confirmation
        return "Passwords do not match"
  model: User

ОБНОВЛЕНИЕ 2

хорошо, я временно исправил это, взломав backbone.js.

Это происходит в функции _prepareModel

Я изменил эту строку:

if (model.validate && !model._performValidation(attrs, options)) model = false;

на эту строку:

if (!options.silent && model.validate && !model._performValidation(attrs, options)) model = false;

Это не решениетак что я держу этот вопрос открытым

Ответы [ 2 ]

0 голосов
/ 13 июня 2012

Когда вы проверяете свою модель, проверьте на model.silent и подтвердите, только если она не существует.

Таким образом, вы делаете следующее, когда хотите получить модель:

var test = new MyModel({ id: '123', silent: true }); 

// in your Model validate function
validate: function(attrs) {
  if (!attrs.silent) {
    // validate logic here
  }
}

Тогда вы можете получить модель. После того, как вы получите свою модель, вы можете отключить молчание.

0 голосов
/ 27 октября 2011
"I added a validation to a Model and a Collection wont fetch the models who arent valid.
(Btw I use coffeescript so the examples are in coffeescript)"

Если ваши модели не проходят валидацию, у вас есть проблема с вашими моделями или с вашей валидацией.

"I have a lot of users without a mobile number."

В вашей валидации у вас есть:

if !attrs.mobile
  return "Mobile number must be provided"

вы можетеопределите функцию parse в вашей коллекции, чтобы регистрировать, какие модели поступают с сервера (parse () получает необработанный ответ от fetch ())

parse: function(response) {
  console.log(response.results);
  return response.results;
}

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

и просто для того, чтобы охватить все базы, определение функции ошибок для fetch () должно помочь вам:

collection.fetch({
  silent: true
  success: ->
    console.log('collection.models:', collection.models)
  error: (collection, response) ->
    console.log('response')
})
...