Come passare parametri a una vista


93

Ho una serie di pulsanti che, se cliccati, visualizzano un menu a comparsa posizionato appena sotto il pulsante. Voglio passare la posizione del pulsante alla vista. Come lo posso fare?

ItemView = Backbone.View.extend({
    tagName: 'li',
    events: {
        'click': 'showMenu'
    },
    initialize: function() {
        _.bindAll(this, 'render');
    },
    render: function() {
    return $(this.el).html(this.model.get('name'));
    },
    showMenu: function() {
        var itemColl = new ItemColl();
        new MenuView({collection: itemColl}); // how to pass the position of menu here?
    }
});

Risposte:


168

Hai solo bisogno di passare il parametro extra quando costruisci il MenuView. Non è necessario aggiungere la initializefunzione.

new MenuView({
  collection: itemColl,
  position: this.getPosition()
})

E poi, dentro MenuView, puoi usare this.options.position.

AGGIORNAMENTO: poiché @mu è stato troppo breve , dalla 1.1.0, le viste Backbone non collegano più automaticamente le opzioni passate al costruttore come this.options, ma puoi farlo da solo se preferisci.

Quindi nel tuo initializemetodo, puoi salvare il optionspassato come this.options:

initialize: function(options) {
    this.options = options;
    _.bindAll(this, 'render');
},

o usa alcuni modi più raffinati come descritto da @Brave Dave .



1
Funziona perfettamente, aggiungi semplicemente il parametro nella tua vista metodo di inizializzazione: inizializzazione: funzione (opzioni) {avviso (opzioni.posizione); }
Cabuxa.Mapache

@ Cabuxa.Mapache No, non funziona. Questa risposta usa this.options.position, no options.position. Viste utilizzate per allegare gli initializeargomenti this.optionsma che hanno smesso di accadere nella 1.1.0.
mu è troppo breve

46

Aggiungi un argomento opzioni a initialize:

initialize: function(options) {
    // Deal with default options and then look at options.pos
    // ...
},

E poi passa alcune opzioni quando crei la tua vista:

var v = new ItemView({ pos: whatever_it_is});

Per ulteriori informazioni: http://backbonejs.org/#View-constructor


questo è più elegante / semplice per la maggior parte delle situazioni.
Cullen SUN

@CullenSUN: Grazie. Preferisco l'esplicita 'di questo approccio, la magica "azione a distanza" dell'utilizzo this.optionsmi crea incubi di manutenzione e debugging.
mu è troppo breve

Ho visto prima il collegamento Backbone ma il tuo esempio me lo ha chiarito. Grazie
Manuel Hernandez

Questo è stato deprecato e non è più possibile utilizzarlothis.options
Viaggio

4
@Trip: eh? initialize: function(options) { ... }va bene, il cambiamento è che Backbone non imposta più automaticamente this.optionsper te: "Backbone Views non allega più automaticamente le opzioni passate al costruttore come this.options, ma puoi farlo da solo se preferisci." .
mu è troppo breve

12

A partire dal backbone 1.1.0, l' optionsargomento non è più allegato automaticamente alla vista (vedere il problema 2458 per la discussione). Ora devi allegare manualmente le opzioni di ciascuna vista:

MenuView = Backbone.View.extend({
    initialize: function(options) {
        _.extend(this, _.pick(options, "position", ...));
    }
});

new MenuView({
    collection: itemColl,
    position: this.getPosition(),
    ...
});

In alternativa puoi usare questo mini plugin per allegare automaticamente le opzioni della lista bianca, in questo modo:

MenuView = Backbone.View.extend({
    options : ["position", ...] // options.position will be copied to this.position
});

-1

passare da un'altra posizione

 new MenuView({
   collection: itemColl,
   position: this.getPosition()
})

Aggiungi un argomento di opzioni per inizializzare in vista che stai ottenendo quella variabile passata,

initialize: function(options) {
   // Deal with default options and then look at options.pos
   // ...
},

per ottenere il valore utilizzare -

   var v = new ItemView({ pos: this.options.positions});

5
scrivere risposte migliori non collettive.
Konga Raju

Questa è una risposta migliorata!
Imtiaz Mirza

-2

Usa this.options per recuperare l'argomento in vista

 // Place holder
 <div class="contentName"></div>

 var showNameView = Backbone.View.extend({
        el:'.contentName',
        initialize: function(){
            // Get name value by this.options.name
            this.render(this.options.name);
        },
        render: function(name){
            $('.contentName').html(name);
        }
    });

    $(document).ready(function(){
        // Passing name as argument to view
        var myName1 = new showNameView({name: 'Nishant'});
    });

Esempio di lavoro: http://jsfiddle.net/Cpn3g/1771/

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.