¿Cómo pasar 'esto' a un evento usando la networking troncal?

Tengo un evento que vincula una function a un clic. El clic llama a otra function en la misma vista. Desafortunadamente, el scope no es el scope correcto. Cuando bash hacer esto .otherFunction (), la function que está asignada al clic no está en el mismo ámbito que this.otherFunction (). ¿Hay alguna manera de pasar en el ámbito de otherFunction ()?

initialize: function() { this.render(); if (joinedGoalList.get(this.model.id) != null) { this.renderLeaveGoal(); } else { this.renderJoinGoal(); } }, events: { "keypress #goal-update": "createOnEnter", "click #join-goal": "joinGoal", "click #leave-goal": "leaveGoal", }, joinGoal: function() { matches = joinedGoalList.where({id: this.model.get("id")}); if (matches.length == 0) { joinedGoalList.create({goal_id: this.model.get("id")}, {wait: true, success: function() { var self = this; self.renderLeaveGoal(); }, error: function() { console.log("error"); }}); } }, renderLeaveGoal: function() { console.log("render leave goal"); var template = _.template($("#leave-goal-template").html()); console.log(template); $("#toggle-goal-join").html(template()); }, 

Todos estos están bajo la misma vista.

Edit: Hmm, ahora el problema es que me sale este error: UnEught TypeError: Object [object DOMWindow] no tiene el método 'renderLeaveGoal'. ¿Parece que guardé el scope equivocado?

La técnica estándar es hacer algo como

 var self = this; 

Entonces puedes hacer

 self.otherFunction(); 

En lugar de

 this.otherFunction(); 

La respuesta de deltanovember es correcta, pero no explicó por qué es correcta, y creo que eso es importante:

El scope es complicado en Javascript. He encontrado que la manera más fácil de seguirlo es pensar cuándo algo se ejecutará. Si un bloque de código se ejecuta de inmediato, probablemente se esté ejecutando en el mismo ámbito que "this". Si una function se va a llamar más tarde, probablemente se ejecute en un ámbito completamente diferente, con su propio concepto de "esto".

En su ejemplo, la function anónima que está proporcionando, como la exitosa callback, se ejecutará más tarde, y no tendrá el mismo "valor" que el código que se está ejecutando cuando se define dicha callback. Es por eso que está obteniendo un error: renderLeaveGoal se definió en el ámbito donde se definió la callback, pero no en el ámbito donde se ejecutará la callback.

Ahora, para hacer esto más confuso, las variables definidas cuando se define una callback estarán disponibles dentro del scope de esa callback. Esta es la razón por la cual la respuesta de deltanovember funciona. Al disfrazar "esto" en una variable cuando se define la callback de éxito, la callback aún puede acceder a ella cuando se ejecuta más tarde, a pesar del scope completamente diferente.

Espero que tenga sentido. Comenta si no es así, y lo intentaré de nuevo 🙂

También puede usar la function bindAll de Underscore así:

 initialize: function() { _.bindAll(this); } 

Detrás de escena, Underscore replaceá todas las llamadas a funciones en el object con versiones proxy que establecen "this" para que sea el mismo "this" que su object original. Por supuesto, si uno de tus methods tiene sus propias funciones anónimas de callback, entonces necesitarás hacer todo el baile "self = this"; bindAll solo corrige el context de sus methods "externos" en el object.

He adquirido el hábito de usar _.bindAll como la primera línea en cada uno de los methods de initialization () de mi Vista.

La function se adjunta a la vista, por lo que debe cancelarla del object Ver.

 success: this.renderLeaveGoal 

En este caso, no necesita la function anónima porque las funciones de vista se vinculan automáticamente al context de la vista.