2012-04-27 15 views
9

Ho appena aggiornato un sito su cui ho lavorato da Backbone.js 0.5.3 a Backbone.js 0.9.2 Quando l'ho fatto ottengo un indefinito per il mio parametro delle opzioni che ho utilizzare nei miei modelli il metodo di inizializzazione. Cosa è cambiato da V.5 a V.9Backbone initialize: funzione (opzioni) non funzionante in V9

initialize: function (opzioni) {} enter code here

Ok ecco la mia struttura del modello. Tutto funziona alla 0.5.3 ma quando uso le opzioni 0.9.2 non funziona più.

this.myModel = Backbone.Model.extend({ 

     defaults: function() { 
      return { 
       maxDays: 7, 
       index: 0 

      }; 
     }, 

     initialize: function(options) { 

     } 

}) 



this.model = new myModel(); 

Nella versione 0.5.3 le opzioni mostreranno tutti gli attributi impostati nell'oggetto predefinito. ma nella versione 0.9.2 questo non funziona più restituisce undefined. Non riesco a pubblicare un collegamento a causa della sensibilità del cliente.

risposta

15

La firma di inizializzazione rimane invariata, credo da 0,5 a 0,9. Tuttavia, ricevi solo le opzioni passate se le passi al costruttore. Controlla lo annotated source for Backbone.Model. Ogni volta che si crea un'istanza di una nuova istanza di modello, il costruttore fa questo:

this.initialize.apply(this, arguments); 

Quindi, qualunque cosa si passa al costruttore viene passato non modificato per inizializzare. Quindi cerca nel tuo codice i casi in cui stai istanziando una nuova istanza di modello ma non passando 2 argomenti (attributi e opzioni).

Sulla base della sua codice di esempio, è ora necessario definire initialize come prendere 2 parametri: attributes e options e quando creare i modelli, se si desidera passare solo le opzioni fare:

var model = new Model(null, options); 

o

Penso che il cambiamento specifico che ha infranto il codice è il passaggio dalla chiamata all'inizializzazione con argomenti espliciti in 0.5.3 all'utilizzo di apply e argomenti in 0.9.3 come questo:

this.initialize.apply(this, arguments); 

Quindi, in 0.9 è possibile ottenere l'accesso ai vostri valori predefiniti attraverso this.attributes, ma non verrà in un parametro di funzione a meno che non sono venuti in come parametro alla funzione di costruzione.

var MyModel = Backbone.Model.extend({ 
    defaults: {x: 42, y: 43}, 
    initialize: function(attributes, options) { 
     console.log(arguments, attributes, this.attributes);} 
}); 
var m = new MyModel(); 

che registrerà [], undefined, Object dal argomenti è vuoto, gli attributi non è definito dal momento che nulla è stato passato al costruttore, ma i valori di default sono stati fissati in this.attributes e sono lì per voi da usare.

+0

Ho aggiunto altro codice sopra. Quindi l'inizializzazione dovrebbe avere 2 parametri. Le opzioni sono state le seconde. Ma se dici che non è cambiato dalla V5, questo non spiega perché funzioni con un solo parametro in V5 e non in V9 – user1096509

+0

Ho controllato il codice sorgente 0.5.3: https://github.com/documentcloud/ backbone/blob/29b60e53fa18b6fffb4a21d0d1c8c9fdbde43b6c/backbone.js # L132 e il codice sorgente 0.9.2: https://github.com/documentcloud/backbone/blob/863814e519e630806096aa3ddeef520afbb263ff/backbone.js#L189 ed entrambi accettano attributi e opzioni. Guardando il tuo codice ora ... –

+0

Ok grazie, quindi ho aggiunto un secondo parametro al mio codice e ancora restituisce undefined per entrambi i parametri in V9. initialize: function (attributes, options) {È questo ciò a cui ti stai riferendo? Quindi in V5 solo il primo parametro funziona nel mio setup. – user1096509

Problemi correlati