2012-01-10 14 views
5

No puedo entender por qué this.model se definiría en view.intialize() cuando ejecuto this.model.fetch() pero no en view.render().¿El modelo de backbone no está definido?

Chrome Developer Tools Screenshot

define([ 
    'jquery', 
    'underscore', 
    'backbone', 
    'text!templates/example.html' 
], function($, _, Backbone, exampleTemplate){ 

    var exampleView = Backbone.View.extend({ 
    el: $('body'), 
    initialize: function() { 
     this.model.set({ _id: this.options.user_id }); 
     this.model.fetch({ 
     success: this.render, 
     error: function(model, response) { 
      console.log('ERROR FETCHING MODEL'); 
      console.log(model); 
      console.log(response); 
     } 
     }); 
    }, 
    render: function() { 
     console.log('HELLO FROM RENDER'); 
     console.log(this.model); 
     console.log('GOODBYE FROM RENDER'); 
    } 
    }); 

    return exampleView; 

}); 
+1

¿Se 'hace referencia a esto' cuando se llama al éxito? Quizás necesites atarlo. – JaredMcAteer

Respuesta

8

Es porque el this está siendo obligado de manera diferente debido rendir está siendo utilizado como una devolución de llamada, poner la siguiente línea como la primera línea en su método initialize de obligar this a la vista actual para el método render:

_.bindAll(this,"render"); 

Underscore.js bindAll function

Enlaza una serie de métodos en el objeto, especificados por methodNames, a se ejecutarán en el contexto de ese objeto siempre que se invoquen. Muy útil para funciones de enlace que se van a utilizar como controladores de eventos , que de lo contrario se invocaría con una bastante inútil.

+0

D'oh, gracias! – djmccormick

+0

@djmccormick ¡De nada! –