2012-03-09 12 views
5

C'è un modo per sopprimere la validazione dei modelli in Backbone.js quando un nuovo modello viene creato?modello Impedire Backbone.js da convalidare al momento della prima aggiunta alla collezione

Nella mia app, ho una collezione con un numero arbitrario di modelli, che sono rappresentati come elementi della lista. L'utente può fare clic su un pulsante su ciascun elemento, che inserisce un nuovo oggetto vuoto sotto l'elemento corrente. L'elemento vuoto sta fallendo la convalida, ovviamente, perché non voglio che un oggetto vuoto venga salvato in seguito.

Non c'è modo per me di sapere quali valori predefiniti potrebbero essere quando creo il nuovo elemento, quindi la prepopolazione del nuovo modello con dati validi non sembra un'opzione.

Qualche suggerimento?

Update: Mentre si lavora su un problema relativo tangenzialmente, mi sono reso conto che stavo usando Backbone.js versione 0.9.0. Quando questa versione è stata rilasciata, altre persone hanno avuto lo stesso problema che ho avuto e si sono lamentate in this issue su GitHub.

Jeremy ha modificato la convalida in 0.9.1 per risolvere questo problema. L'aggiunta di un modello (temporaneamente) vuoto a una raccolta è un caso d'uso valido nel mondo reale. Puoi gestire il nuovo modello vuoto nella vista, ma se gestisci un elenco di elementi come I am, ciò ti obbliga ad avere una collezione di viste di elementi (incluso quella vuota) oltre alla tua collezione di must modelli validi. È una soluzione davvero goffo per uno scenario altrimenti semplice. Sono contento che questo è stato risolto.

risposta

3

Non dovresti aggiungere modelli validi :)

scavando un po 'nel codice sorgente Backbone (0.9.1 almeno) ha mostrato che il meccanismo può essere aggirato passaggio delle opzioni al vostro metodo add:

var Mod=Backbone.Model.extend({ 
    validate: function(attrs,opts) { 
     if (opts.init) return; 
     return "invalid"; 
    } 
}); 

var Col=Backbone.Collection.extend({ 
    model:Mod 
}); 

var c=new Col(); 
c.add({},{init:true}); 

console.log(c.length); 

un violino: http://jsfiddle.net/jZeYB/

Attenzione: si può rompere le cose su tutta la linea.

+0

Non aggiungere modelli non validi ha senso in teoria, ma non riesco a pensare a un modo migliore per consentire all'utente di aggiungere una nuova riga. Immagino di poter gestire tutto questo nella vista, quindi aggiungere l'elemento alla raccolta quando è valido, ma ciò complicherebbe notevolmente altri aspetti di questa app. Il tuo esempio funziona alla grande, ma quando lo provo nella mia app il parametro 'options' viene sovrascritto con l'oggetto' {silent: true} ', che Backbone.js sembra automaticamente in shoehorn. Sono molto perplesso adesso. –

+0

Non si dovrebbero aggiungere modelli non validi: la vista dovrebbe catturare il messaggio di errore inviato dalla validazione sul modello e consentire all'utente di correggere il proprio input o cancellarlo. Quando raccolgo informazioni dal nostro server e ottengo dati non validi, lo faccio cadere sul pavimento (e invio un messaggio alla nostra struttura di registrazione Ajax) perché i modelli non validi in una raccolta sono una "cattiva idea" – tkone

2

È necessario aggiungere subito il modello alla raccolta? Presumo che la convalida fallisca perché la aggiungi immediatamente alla raccolta.

Invece, quando si preme il pulsante, è sufficiente creare la vista e il modello vuoto. Quando il modello lo convalida, lo aggiungi alla raccolta. Avresti bisogno di un pulsante/meccanismo di invio sulla nuova riga per aggiungerlo alla raccolta (che richiama automaticamente la convalida).

+0

Ho intenzione di dai una possibilità. Potrei probabilmente aggiungere l'elemento nel gestore 'change' del modello, che eliminerebbe la necessità di un pulsante di invio. Verrà aggiunto quando il campo perde il focus. Grazie! –

Problemi correlati