2015-11-30 42 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 
相關問題