w3schools loop for example array javascript coffeescript

javascript - for - loop $.each jquery



Coffeescript ''esto'' dentro de jQuery.each() (3)

Tu codigo...

class foo @bar = ''bob loblaw'' processRows: -> $("#my-table>tr").each -> id = $(this).attr("id") @processRow id processRow: (id) -> console.log @bar + id

Se transporta a ...

var foo; foo = (function() { function foo() {} foo.bar = ''bob loblaw''; foo.prototype.processRows = function() { return $("#my-table>tr").each(function() { var id; id = $(this).attr("id"); return this.processRow(id); }); }; foo.prototype.processRow = function(id) { return console.log(this.bar + id); }; return foo; })();

Lo cual ha supuesto mucho sobre el contexto actual al que se está traduciendo. Desafortunadamente, como jQuery maneja el contexto, deberás ser explícito o declarar una referencia a esto de tu clase.

Por cierto, hay otros problemas con el código generado, eche un vistazo a este caso reducido:

class foo @bar = ''bob loblaw'' getBar: () -> @bar

Transpiles a:

var foo; foo = (function() { function foo() {} foo.bar = ''bob loblaw''; foo.prototype.getBar = function() { return this.bar; }; return foo; })();

Los resultados de intentar usar esta pieza de código:

> foo.bar; "bob loblaw" > var f = new foo(); undefined > f.getBar(); undefined

Su código parece esperar que @bar sea ​​propiedad propia, pero se está creando como una propiedad estática de la función foo

Tengo un coffeescript como el siguiente:

class foo: @bar = ''bob loblaw'' processRows: -> $("#my-table>tr").each -> id = $(this).attr("id") @processRow id processRow: (id) -> console.log @bar + id

Entonces mi problema es: necesito this para hacer referencia al contexto de cada uno dentro del ciclo para obtener id , pero también me gustaría que this haga referencia a la instancia de clase dentro de foo.processRow() --- que no lo hace actualmente.

Usar algo como _this = this fuera de la función .each y pasarlo no es una gran solución, ya que hago referencia a muchas variables de clase dentro de processRow .

¿Alguna idea? ¿Me estoy perdiendo algo obvio? ¡Gracias!


Tu dices

Usar algo como _this = this fuera de la función .each y pasarlo no es una gran solución, ya que hago referencia a muchas variables de clase dentro de processRow.

Esta es la solución más eficiente, sin embargo. JavaScript es una bestia extraña; puedes mantenerlo fijo dentro de una función anidada usando el operador => , ya que arnaud576875 sugiere su respuesta (que es elegante pero ineficiente), o puedes copiar this a otra variable (que es eficiente pero poco elegante). La decisión es tuya.

Tenga en cuenta que algunos navegadores modernos admiten un método de bind en cada función, que es más eficiente que CoffeeScript => . Hay un ticket abierto para tener => usar el bind nativo cuando esté disponible: https://github.com/jashkenas/coffee-script/pull/1408

Adición: Por supuesto, una alternativa más eficiente que cualquiera de las anteriores sería escribir

for element, index in $(''#my-table>tr'') ...

que también resolvería tu problema.


jQuery.each pasa el elemento actual como segundo parámetro de la devolución de llamada, por lo que no tiene que reservar this para jQuery:

processRows: -> $("#my-table>tr").each (index, element) => id = $(element).attr("id") @processRow id

Observe el uso de la sintaxis de la flecha de grasa ( => ) para la función de devolución de llamada; enlaza el contexto de la función con el valor actual de this . ( this en la función de devolución de llamada siempre es el mismo que en el momento en que definió la función).