2015-11-30 46 views
0

我正在与骨干,当我生成的视图,我有错误无法读取属性'推'的未定义“。错误的行是”self.subViewsReservas.push (新ReservaView(){”在推骨干无法读取未定义的属性'推'

ReservaCollectionView = Backbone.View.extend({ 

initialize: function() { 
    if (Session.get('authenticated') && Session.get('authenticated') !== false) { 
     this.paginacionVista = new PaginacionReservasView({ 
      collection: this.collection, 
      el: '.paginacionReservas', 
      reservasPagina: 5, 
     }); 
     this.buscadorVista = new BuscadorView({ 
      el: 'div.buscador-reservas', 
      //Pasamos la colección oficinas ya que hará las veces del conjunto de oficinas retornadas por el servidor 
      collection: new OficinasCollection(oficinas), 
     }); 
    } 
    else { 
    } 
}, 
render: function() { 
    var self = this; 
    this.template = _.template($('#divReservaTpl').html(), {}); 
    self.$('.contenedor-reservas').empty(); 
    self.collection.each(function (reserva, index) { 
     self.$('.contenedor-reservas').append(self.template({'data': reserva.toJSON()})); 
    }); 
    this.collection.each(function (reserva, index) { 
     this.subViewsReservas = []; 
      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; 
}, 

};

AppView = Backbone.View.extend({ 
    initialize : function(){ 
      var self = this; 

      self.usu = new UsuarioModel(); 
      self.usu.fetch({ 
       success: function (model){ 
        Session.fetch({ 
         success : function(){ 

          Session.set('nombre',model.get('Nombre')); 
          Session.set('apellidos',model.get('Apellidos')); 
          Session.set('puntos_club',model.get('Puntosclub')); 

          self.render(); 
         } 
        }); 

        self.sideBar = new SideBarView({ 
         el : '.sidebar', 
         model: model 
        }); 
        self.sideBar.markOption('mis-reservas'); 
      AppView = Backbone.View.extend({ 
    initialize : function(){ 
      var self = this; 

      self.usu = new UsuarioModel(); 
      self.usu.fetch({ 
       success: function (model){ 
        Session.fetch({ 
         success : function(){ 

          Session.set('nombre',model.get('Nombre')); 
          Session.set('apellidos',model.get('Apellidos')); 
          Session.set('puntos_club',model.get('Puntosclub')); 

          self.render(); 
         } 
        }); 

        self.sideBar = new SideBarView({ 
         el : '.sidebar', 
         model: model 
        }); 
        self.sideBar.markOption('mis-reservas'); 
       }, 
       error : function(){ 
        document.location = '/mygoldcar/login'; 
       } 
      });    

      this.listenTo(Session, 'change', self.update);   
    }, 
    render : function(){ 
      var self = this; 
      var reservas = new ReservasCollection(); 
      reservas.fetch({ 
       success: function (collection){ 
        if (typeof collection.models[0].get('error') == 'undefined' || !collection.models[0].get('error')) { 
         var listRes = new ReservaCollectionView({ 
          el : '.reservas-list', 
          collection: collection 
         }); 
         listRes.render(); 

         var popoverModel = new Popover(); 
         popoverModel.setData(collection.models[0].get('kilometraje_ilimitado'), collection.models[0].get('duracion')); 

         self.popover = new PopoverView({ 
          el: 'body', 
          model: popoverModel 
         }); 

         self.popover.establecerPopover(); 
        } 
        else document.location = '/mygoldcar' + self.urlLang(lang) + '/mi-cuenta/#msg/1';      
       }, 
       error: function() { 
        document.location = '/mygoldcar' + self.urlLang(lang) + '/mi-cuenta/#msg/1';      
       } 
      }); 
    }, 
     update: function() { 
      var self = this; 
      self.sideBar.update(Session.get('nombre'),Session.get('apellidos'),Session.get('puntos_club')); 
      self.$el.find('.nombre-usuario').text(Session.get('nombre'));    
     }, 
     updatePoints: function() { 
      var self = this; 
      self.usu.fetch({ 
       success: function (model){ 
        Session.set('puntos_club',model.get('Puntosclub')); 
       } 
      }); 
     } 
}); }, 
       error : function(){ 
        document.location = '/mygoldcar/login'; 
       } 
      });    

      this.listenTo(Session, 'change', self.update);   
    }, 
    render : function(){ 
      var self = this; 
      var reservas = new ReservasCollection(); 
      reservas.fetch({ 
       success: function (collection){ 
        if (typeof collection.models[0].get('error') == 'undefined' || !collection.models[0].get('error')) { 
         var listRes = new ReservaCollectionView({ 
          el : '.reservas-list', 
          collection: collection 
         }); 
         listRes.render(); 

         var popoverModel = new Popover(); 
         popoverModel.setData(collection.models[0].get('kilometraje_ilimitado'), collection.models[0].get('duracion')); 

         self.popover = new PopoverView({ 
          el: 'body', 
          model: popoverModel 
         }); 

         self.popover.establecerPopover(); 
        } 
        else document.location = '/mygoldcar' + self.urlLang(lang) + '/mi-cuenta/#msg/1';      
       }, 
       error: function() { 
        document.location = '/mygoldcar' + self.urlLang(lang) + '/mi-cuenta/#msg/1';      
       } 
      }); 
    }, 
     update: function() { 
      var self = this; 
      self.sideBar.update(Session.get('nombre'),Session.get('apellidos'),Session.get('puntos_club')); 
      self.$el.find('.nombre-usuario').text(Session.get('nombre'));    
     }, 
     updatePoints: function() { 
      var self = this; 
      self.usu.fetch({ 
       success: function (model){ 
        Session.set('puntos_club',model.get('Puntosclub')); 
       } 
      }); 
     } 
}); 
+0

将'this.subViewsReservas = [];'移到你的'each()'之外(将它移动2行)。虽然它不解释你的'推动没有定义'的错误,这只是看起来错了。 –

+0

仍然无法正常工作 –

回答

1

里面collection.eachthis点的集合,以便物业subViewsReservas被添加到它,而不是视图实例。当您尝试像那样访问它时,self指向视图实例,该实例没有subViewsReservas属性,因此出现错误。

像你在做的那样初始化each中的一个数组没有太大的作用,因为它会在每次调用回调时重置。

你应该在initialize方法,这是正确的地方初始化的事情,在这里this将正确地指向视图实例如下图所示

initialize: function() { 
    this.subViewsReservas = []; 
} 

出于某种原因被初始化它如果您希望集合每次都重置,则可以通过将每个对象的第二个参数作为参数传递来更改上下文:

this.collection.each(function (reserva, index) { 
    this.subViewsReservas = []; 
     self.subViewsReservas.push(new ReservaView({ 
      el: '#' + reserva.get('Idreserva'), 
      model: reserva 
     })); 
}, self); // <--- makes view the context of callback, 
      // both 'self' and 'this' will refer to view 
相关问题