2012-02-23 3 views
3

Я использую магистральный-на-рельсы камень и получили следующее:стороны клиента проверка на коллекции Backbone.js

Модели

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" 

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

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() 
+0

вашей коллекции коллекции цветов или что-то другое? –

ответ

2

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

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

+0

Я пробовал сделать это в update2, но я думаю, что я не правильно устанавливаю модель в коллекции, и в результате приложение не загружается. можете ли вы предложить, как установить модель в коллекции? – Omnipresent

+0

dont использовать 'new' при установке свойства модели - вам нужно просто передать ссылку на конструктор, поэтому' Crayons.Models.Color' достаточно –

+0

ah и Collections не имеют метода проверки - проверка модели используется при сохранении/создании моделей коллекции –

Смежные вопросы