使用主干

时间:2015-11-30 11:40:14

标签: jquery json backbone.js append

我正在使用Backbone和Dyson来模拟API。我尝试显示JSON的结果,但我有错误:未捕获TypeError:self.template不是函数。

ReservaCollectionView = Backbone.View.extend({
initialize: function () {
    if (Session.get('authenticated') && Session.get('authenticated') !== false) {
        this.template = _.template($('#divReservaTpl').html(), {});

        //Vector donde almacenamos las subvistas que corresponden a las reservas
        this.subViewsReservas = [];
        //Instancia de la vista de la paginación
        this.paginacionVista = new PaginacionReservasView({
            collection: this.collection,
            el: '.paginacionReservas',
            reservasPagina: 5,
        });
        //Instancia de la vista del buscador (simulamando los datos del servidor que corresponden a la colección oficinas )
        this.buscadorVista = new BuscadorView({
            el: 'div.buscador-reservas',
            collection: new OficinasCollection(oficinas),
        });
    }
    else {
    }
},
render: function () {
    var self = this;
    //var fragment = document.createDocumentFragment();
    self.$('.contenedor-reservas').empty();
    self.collection.each(function (reserva, index) {
      console.log(reserva);
      console.log(index);

        self.$('.contenedor-reservas').append(self.template({'data': reserva.toJSON()}));

    });

    this.collection.each(function (reserva, index) {
        self.subViewsReservas.push(new ReservaView({
            el: '#' + reserva.get('Idreserva'),
            model: reserva
        }));
    });


    this.collection.each(function (reserva, index) {
        //Limite de la paginacion 5 limite arbitrario
        if (index < 5) {
            //Lo Marcamos como visible y actualiazamos la paginación
            self.collection.get(reserva.get('Idreserva')).set({'Visibilidad': true});
        }
    });

    this.paginacionVista.render();

    return this;
},

});

reservaJSON()的值:

{"Idreserva":"1","Idcliente":403,"Idtarifa":3,"Idgrupo":3,"Bono":"WG5000218E","BonoAgencia":"7741124","Fecha":"2015-02-17 11:49:09","Dropoffdate":"2015-02-17 11:49:09","Pickupdate":"2015-02-17 11:49:09","Grupo":"XXX","reserva_status":3,"Estado":3,"status":true}

2 个答案:

答案 0 :(得分:1)

可能发生这种情况的一种情况是条件

if (Session.get('authenticated') && Session.get('authenticated') !== false) 

失败。

在这种情况下,this.template = _.template($('#divReservaTpl').html(), {});将无法执行,template属性将不会出现在视图中。

我建议在视图定义中使用template属性,如文档中所示:

ReservaCollectionView = Backbone.View.extend({
 initialize: function () 
 },
 template: _.template($('#divReservaTpl').html()),
 render: function(){}
});

然后,您可以根据条件安全地选择是否render视图。

可能发生此错误的另一种情况是render方法执行的上下文(this)引用除视图之外的其他内容。

答案 1 :(得分:-1)

当你做

时,我认为你正在失去上下文
var self = this;

尝试将下面的代码放在初始化函数中。

如果你在初始化中执行var self = this,这将引用对象View,但是如果你在函数中执行它,它将引用该函数!