如何将参数传递给视图


93

我有一系列按钮,当单击它们时,将显示一个位于按钮正下方的弹出菜单。我想将按钮的位置传递给视图。我怎样才能做到这一点?

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

Answers:


168

您在构造MenuView时只需要传递额外的参数。无需添加initialize功能。

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

然后,在中MenuView,您可以使用this.options.position

更新:由于@mu的状态太短,自1.1.0起, Backbone Views不再自动将传递给此构造函数的选项作为this.options附加,但您可以根据需要自己进行操作。

因此,在您的initialize方法中,您可以将options传递的另存为this.options

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

或使用@Brave Dave所述的一些更好的方法。



1
这很完美,只需在视图的初始化方法中添加参数即可:initialize:function(options){alert(options.position); }
Cabuxa.Mapache 2014年

@ Cabuxa.Mapache不,它不起作用。这个答案使用了this.options.position,不是options.position。以前将initialize参数附加到的视图this.options在1.1.0中已停止发生。
亩太短

46

将选项参数添加到initialize

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

然后在创建视图时传递一些选项:

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

有关更多信息:http : //backbonejs.org/#View-constructor


在大多数情况下,这更加优雅/简单。
Cullen SU​​N

@CullenSUN:谢谢。我更喜欢这种方法的明确性,使用神奇的“远距离操作” this.options给我带来了维护和调试的噩梦。
亩太短,

我首先看到了Backbone链接,但是您的示例为我澄清了它。谢谢
曼努埃尔·埃尔南德斯

已弃用该标签,您不能再使用this.options
旅行

4
@旅行:嗯?initialize: function(options) { ... }很好,所做的更改是Backbone不再自动this.options为您设置:“ Backbone Views不再自动将传递给构造函数的选项附加为this.options,但是您可以根据需要自己进行操作。”
亩太短

12

从主干1.1.0开始,该options参数不再自动附加到视图(有关讨论,请参见问题2458)。现在,您需要手动附加每个视图的选项:

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

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

或者,您可以使用此微型插件自动附加白名单中的选项,如下所示:

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

-1

从其他位置通过

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

添加选项参数以在您获取传递的变量的视图中进行初始化,

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

获得价值使用-

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

5
写出更好的答案而不是集体。
Konga Raju 2012年

这是改进的答案!
Imtiaz Mirza 2015年

-2

使用this.options在视图中检索参数

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

工作示例:http : //jsfiddle.net/Cpn3g/1771/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.