2012-11-26 11 views
5

La documentazione Backbone dice:intesa Backbone Modello set, convalidare e modificare i callback

Model.set fallirà se la convalida non riesce - non impostare il valore pertanto non dà luogo ad alcuna callback. Possiamo passare {silent: true} a Model.set - quindi imposterà il valore ma non attiverà nessun callback.

Quindi,

Perché Backbone modello richiede uno stato valido per impostare semplicemente un valore di attributo? Cosa succede se vogliamo impostare gli attributi mentre l'utente interagisce con l'interfaccia utente, ma il modello non è ancora valido? Significa che i callback delle modifiche non sono disponibili a meno che non passiamo {silent: true}, quindi attiviamo manualmente la modifica ?!

prega di dire si conosce un modo migliore di gestire questo :)

risposta

3

io non sono sicuro di come rispondere alle Why domande, ma si potrebbe dire che ci sono argomenti per il motivo per cui è bene che insieme esegue convalide. Ad esempio, rende praticamente impossibile eseguire la convalida del lato client in tempo reale.

Se il problema può essere risolto solo convalidando il valore attualmente modificato dall'utente, è possibile farlo combinando il metodo validate con il metodo hasChanged.

Per esempio qualcosa di simile:

Backbone.Model.extend({ 
    defaults : { name : "" }, 

    validate : function (attrs) { 
    var errors = {}; 
    if(this.hasChanged("name") && attr.name.length == 0) { 
     errors.name = "Need a name yo!"; 
    } 
    //... 

    if(_.keys(errors).length > 0) { 
     return errors; 
    } 
    } 
}) 
+0

Grazie Andrew, ma questo risolverebbe un problema e ne creerebbe un altro: salta la convalida per valori invariati. – wcamarao

3

In Backbone ogni volta che si chiami imposta dal modello, tiene traccia di quali attributi del modello è stato cambiato e quali attributi sono state recentemente added.Calling validate lo permette più efficiente nel farlo. Passando a {silent: true}, le opzioni nella funzione set causano la convalida e il cambiamento non viene eseguito, quindi se non si attivano eventi di modifica.

If you want to set attributes as the user interacts with the UI, but the model is not valid yet

In questo caso è possibile impostare il cambiamento di un oggetto pianura Accertarsi che i codici oggetto sono sames come attributo del modello e poi a un certo punto è sufficiente impostare nel modello.

var uiChanges = {name:'x'}; //just fill it with your changes 
ur_model.set(uiModel); //then set it ,this way it fires change events only once 

Per controllare la diff tra l'oggetto pianura e il modello è possibile utilizzare il ur_model.changedAttributes(uiChanges);

changedAttributes - restituire un oggetto che contiene tutti gli attributi che sono stati modificati, o falso se non ci sono attributi modificati.

È possibile utilizzarlo ulteriormente, salvare solo gli attributi che sono stati modificati anziché salvare di nuovo l'intero modello.

Problemi correlati