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

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 .



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


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

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

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/

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.