Backbone:将模型属性传递给视图返回undefined

时间:2013-01-09 20:59:15

标签: javascript backbone.js

var ShapeSizePoolView = Backbone.View.extend({
    el : $('#agpb_shape_size_body'),    
    tmpl : $('#tmpl_agpb_shape_size').html(),
    initialize : function() {
        this.render();
    },
    render : function() {
        var compiled_template = _.template( this.tmpl, this.model.toJSON() ),
            sizes = this.model.get('sizes');
        $(this.el).append( compiled_template );

        // this is used for our pool sizes
        for(var i = 0; i < sizes.length; i++) {
            console.log(sizes[i]);
            new ShapeSizePoolButtonView(
            { 
                size : sizes[i],
                el : $(this.el).find('.agpb_size_list')
            });
        }
    }
});

var ShapeSizePoolButtonView = Backbone.View.extend({
    tmpl : $('.tmpl_agpb_shape_size_button').html(),
    initialize : function() {
        // this.render();
        console.log( this.size );
        },
        render : function() {
            var compiled_template = _.template( this.tmpl, this.sizes );
            $(this.el).append( compiled_template );
        }
});

this.model.get('sizes')返回一个对象数组。如果我在console.log中找到了ShapeSizePoolView中的一个对象:

{
    id: "6", 
    dimensions: "12'",
    price: "649.99", 
    sort_order: "1"
} 

我将此对象传递给一个新视图,但是如果我从ShapeSizePoolButtonView中调用console.log this.size,我得到:

undefined

有没有人知道我哪里出错了?

谢谢!

2 个答案:

答案 0 :(得分:2)

来自Backbone docs

  

创建新视图时,您传递的选项 - 合并后   进入视图中已存在的任何默认选项 - 附加到   作为this.options的视图供将来参考。有几个   特殊选项,如果通过,将直接附加到   view:model,collection,el,id,className,tagName和attributes。

因此,您可以使用this.options

访问此自定义选项
var ShapeSizePoolButtonView = Backbone.View.extend({
    tmpl : $('.tmpl_agpb_shape_size_button').html(),
    initialize : function() {
        // this.render();
        console.log( this.options.size ); // Not this.size
    },
    ....
});

答案 1 :(得分:1)

您正在将size传递给View构造函数,但它不会自动复制到this。您需要添加如下代码:

var ShapeSizePoolButtonView = Backbone.View.extend({
  initialize : function(options) {
    this.size = options.size;
    // this.render();
    console.log( this.size );
  },

此外,您在渲染调用中错误地使用了this.sizes而不是this.size