2011-12-11 18 views
30

Scenario:
Ho ricevuto una alert() dicendo undefined quando ho (provare a) impostare la variabile myVar attraverso il Costruttore. Tuttavia, se taccio il commento allo myVar che vive all'interno di myView, l'avviso dice invece "Ciao da dentro", proprio come ci si aspetterebbe.Backbone.js - il passaggio di argomenti attraverso i costruttori

Domanda:
Significa questo che non riesco a impostare alcuna params nel costruttore della vista, tranne dorsali propri params, come ad esempio model, collection, el, id, className & tagName?
manuale: http://documentcloud.github.com/backbone/#View-constructor

Il codice:

var myView = Backbone.View.extend({ 

    //myVar : 'Hello from inside', 

    initialize: function() { 
     alert(this.myVar); 
    } 
)}; 

new myView({myVar: 'Hello from outside'}); 

risposta

56

Opzioni passato al costruttore vengono automaticamente memorizzati come this.options

var myView = Backbone.View.extend({ 

    myVar : 'Hello from inside', 

    initialize: function() { 
     alert(this.options.myVar); 
    } 
)}; 

new myView({myVar: 'Hello from outside'}); 
+0

Fantastic. Aveva completamente perso quello nel manuale! – Industrial

+11

Va notato che in questa situazione la vista appena creata avrà "this.myVar' e' this.options.myVar'. Se stai cercando di sovrascrivere 'this.myVar' con le opzioni passate potresti voler' this.myVar = this.options.myVar' nella tua funzione di inizializzazione. – czarchaic

+3

Fantastico! Ricerca rapida da Google. –

24

A partire dal backbone 1.1.0, l'argomento options è no longer attached automaticamente alla vista (vedere issue 2458 per la discussione). A questo punto è necessario allegare le opzioni di ogni vista manualmente:

MyView = Backbone.View.extend({ 
    initialize: function(options) { 
     _.extend(this, _.pick(options, "myVar", ...)); 
     // options.myVar is now at this.myVar 
    } 
}); 

new MyView({ 
    myVar: "Hello from outside" 
    ... 
}); 

In alternativa è possibile utilizzare this mini plugin per l'auto-attach opzioni bianche quotate, in questo modo:

MyView = BaseView.extend({ 
    options : ["myVar", ...] // options.myVar will be copied to this.myVar on initialize 
}); 
Problemi correlati