So übergeben Sie Parameter an eine Ansicht

93

Ich habe eine Reihe von Schaltflächen, die beim Klicken ein Popup-Menü direkt unter der Schaltfläche anzeigen. Ich möchte die Position der Schaltfläche an die Ansicht übergeben. Wie kann ich das machen?

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?
    }
});
Vikmalhotra
quelle

Antworten:

168

Sie müssen nur den zusätzlichen Parameter übergeben, wenn Sie die MenuView erstellen. Die initializeFunktion muss nicht hinzugefügt werden.

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

Und dann MenuViewkönnen Sie in verwenden this.options.position.

UPDATE: Da @mu zu kurz ist , fügen Backbone-Ansichten seit 1.1.0 nicht mehr automatisch Optionen hinzu, die als this.options an den Konstruktor übergeben wurden. Sie können dies jedoch selbst tun, wenn Sie dies bevorzugen.

In Ihrer initializeMethode können Sie die übergebenen optionsDaten wie folgt speichern this.options:

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

oder verwenden Sie einige feinere Methoden, wie von @Brave Dave beschrieben .

Dira
quelle
1
Dies funktioniert einwandfrei. Fügen Sie einfach den Parameter in Ihre Ansicht ein. Initialisierungsmethode: initialize: function (options) {alert (options.position); }
Cabuxa.Mapache
@ Cabuxa.Mapache Nein, es funktioniert nicht. Diese Antwort verwendet this.options.positionnicht options.position. Ansichten, mit denen die initializeArgumente this.optionsangehängt wurden , aber das ist in 1.1.0 nicht mehr passiert.
Mu ist zu kurz
46

Fügen Sie ein Optionsargument hinzu zu initialize:

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

Und geben Sie dann einige Optionen ein, wenn Sie Ihre Ansicht erstellen:

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

Für weitere Informationen: http://backbonejs.org/#View-constructor

mu ist zu kurz
quelle
Dies ist für die meisten Situationen eleganter / einfacher.
Cullen SUN
@CullenSUN: Danke. Ich bevorzuge die explizite Aussage dieses Ansatzes, die magische "Aktion in der Ferne" der Verwendung this.optionsgibt mir Wartung und Debugging von Albträumen.
Mu ist zu kurz
Ich habe zuerst den Backbone-Link gesehen, aber Ihr Beispiel hat ihn für mich klargestellt. Danke
Manuel Hernandez
Dies ist veraltet und Sie können nicht mehr verwendenthis.options
Trip
4
@ Trip: Huh? initialize: function(options) { ... }ist in Ordnung, die Änderung ist, dass Backbone nicht mehr automatisch this.optionsfür Sie festlegt : "Backbone-Ansichten hängen nicht mehr automatisch Optionen an, die an den Konstruktor als übergeben wurden this.options, aber Sie können es selbst tun, wenn Sie es vorziehen." .
Mu ist zu kurz
12

Ab Backbone 1.1.0 wird das optionsArgument nicht mehr automatisch an die Ansicht angehängt (siehe Ausgabe 2458 für Erläuterungen). Sie müssen jetzt die Optionen jeder Ansicht manuell anhängen:

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

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

Alternativ können Sie dieses Mini-Plugin verwenden , um Optionen auf der weißen Liste automatisch anzuhängen, wie z.

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

von einem anderen Ort passieren

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

Fügen Sie ein Optionsargument hinzu, um die Ansicht zu initialisieren, dass Sie die übergebene Variable erhalten.

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

um den Wert zu erhalten verwenden -

   var v = new ItemView({ pos: this.options.positions});
Imtiaz Mirza
quelle
5
Schreibe verbesserte Antworten, nicht kollektiv.
Konga Raju
Dies ist eine verbesserte Antwort!
Imtiaz Mirza
-2

Verwenden Sie diese Optionen , um argumentr in der Ansicht abzurufen

 // 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'});
    });

Arbeitsbeispiel: http://jsfiddle.net/Cpn3g/1771/

Nishant Kumar
quelle