2012-10-27 13 views
11

Sto tentando di rimuovere completamente un attributo da un modello backbone. Il modello viene inviato a un'API che non è molto flessibile e si interromperà se invio attributi aggiuntivi rispetto a quelli che dovrei inviare, quindi devo rimuovere un attributo in modo che non esista più.Rimuovere completamente l'attributo dal modello Backbone.js

ho provato model.unset, da this question, ma quando stampo l'oggetto l'attributo che sto cercando di rimuovere è ancora elencato, solo con un valore null.

Ho bisogno che l'attributo sia completamente sparito.

La mia struttura di base è:

model.unset("AttrName", "silent"); 

risposta

18

Il problema è che si sta utilizzando i parametri per unset in modo errato. "Silent" dovrebbe far parte di un options hash, non un parametro separato. Questo funziona:

model.unset("AttrName", { silent: true }); 

La ragione per il comportamento anomalo può essere visto dalla annotated source:

unset: function(attr, options) { 
    (options || (options = {})).unset = true; 
    return this.set(attr, null, options); 
}, 

Procedimento unset presuppone che il suo parametro options è un oggetto, e tentativi per creare sia o modificarlo, quindi passarlo al metodo set. Se invece si passa una stringa, l'effetto involontario del codice è quello di impostare l'attributo su null anziché su unset.

+0

Se cambio le opzioni in modo che sia un hash come questo innesca un evento change, che è esattamente quello che sto cercando di evitare con l'opzione silent. – FrizbeeFanatic14

+0

@ FrizbeeFanatic14 qualcos'altro è sbagliato: se si utilizza questa sintassi, non dovrebbe generare un evento di modifica (l'ho appena testato). – McGarnagle

+0

Hai ragione, era qualcos'altro che chiamava quell'evento. Grazie. – FrizbeeFanatic14

1

l'override del metodo toJSON del modello e includere solo gli attributi che si desidera inviare.

Aggiornato: (esempio di codice aggiunto)

Quando l'estensione del modello, aggiungere una funzione toJSON e restituire un oggetto con gli attributi desiderati:

{ 
    toJSON : function() { 
     return { 
      name: this.get('name'), 
      age: this.get('age'), 
      phoneNumber: this.get('phoneNumber') 
     }; 
    } 
} 
+0

Sono abbastanza nuovo a Backbone - esattamente come potrei fare per questo? – FrizbeeFanatic14

0

Si potrebbe provare solo la costruzione di un oggetto con solo le proprietà desiderate (e trasmettere tali):

serializeModel: function() { 
    return { 
    email: this.$("#email").val(), 
    password: this.$("#password").val() 
    } 
} 
Problemi correlati