传递参数进行查看

时间:2013-11-23 16:05:26

标签: javascript backbone.js backbone-views

我尝试传递一些参数来查看构造函数。

我正在以这种方式创建我的对象:new HeadCell({isSortable: true, parent: this});

所以在HeadCell初始化:

initialize: function(options){
   console.log("HeadCell initialized");
   console.log(options);
   console.log(options.isSortable);
}

控制台输出是:

  

HeadCell初始化了   Object {isSortable:true,parent:r}

     

未捕获的TypeError:无法读取未定义的属性'isSortable'

有什么想法吗?

更新1

我尝试在小提琴中进行一点测试,结果是一样的。

http://jsfiddle.net/ramiromd90/hHFP3/

更新2

我在小提琴上试试你的例子,并且工作正常!但是,在我的代码中不起作用。

这里有一个关于我的真实代码的小例子的小提琴:

http://jsfiddle.net/ramiromd90/XCK47/

更新3

感谢所有回复,问题是我没有传递循环中的参数(参见小提琴)。传递我们说的参数的方法是正确的!感谢

2 个答案:

答案 0 :(得分:4)

您的小提琴中的代码不正确,因为当您的options参数从未初始化为视图对象的一部分时,您正在调用this.options。换句话说,您正在调用不存在的属性

请改为尝试:

$(function(){
    var Aview = Backbone.View.extend({
        initialize: function(options){
            console.log(options.foo);
            console.log(options.bar);
        }
    });

    new Aview({foo:'isFoo!',bar:'isBar!'}); 
});

现在,让我们更详细地了解当你将它作为参数传递给构造函数时,options参数实际发生了什么。

根据doc

有几个特殊选项,如果通过,将直接附加到视图:model,collection,el,id,className,tagName,attributes和events。

这是什么意思?那么,options参数实际上在视图构造函数中以两种方式使用。

首先,它使用此调用设置特殊选项

_.extend(this, _.pick(options, viewOptions));

返回一个只包含viewOptions中特殊选项的新对象,然后将这些选项添加到视图对象中。

接下来,一旦添加了这些特殊选项,它就会调用initialize函数。

this.initialize.apply(this, arguments);

在这种情况下,它相当于调用

currentViewObject.initialize({anOptionsAttribute: 'hello'});

允许您作为参数或通过arguments对象访问选项对象。正如您所看到的,在任何时候都没有将options参数设置为属性,因此调用this.options只是荒谬的。

答案 1 :(得分:1)

View = Backbone.View.extend({
  initialize: function(options){
    console.log(options);
    console.log(options.isSortable);
  }
});

var view = new View({isSortable: true, parent: this });

http://jsfiddle.net/sbjaz/2/

我不明白为什么它不起作用。你仔细检查了拼写吗?

“this.options”已在主干1.1.0中删除 见:

http://backbonejs.org/#upgrading

  

在1.1中,Backbone Views不再自动附加options参数作为this.options。如果您愿意,请随意继续添加。