2010-01-09 13 views
16

Perdona mi ignorancia ya que no estoy tan familiarizado con jquery. ¿Hay un equivalente a dojo.hitch()? Devuelve una función que se garantiza que se ejecutará en el alcance dado.¿tiene jquery un equivalente de dojo.hitch()?

- edición - Según lo solicitado, aquí hay un ejemplo. Uso el enganche con mucha frecuencia para asegurar que las devoluciones de llamada se ejecuten dentro del objeto correcto. Por ejemplo, supongamos que tengo un método de utilidad llamado doSomethingAsync y le paso una función de devolución de llamada. Con el enganche, puedo hacer que la función se ejecuta dentro de un ámbito particular, aunque el método de utilidad realiza llamadas ajax y así sucesivamente:


expectedScopeObj = { 
    flag: true, 
    callback: function(){console.debug(this.flag);}, 
    main: function() { 
    // without hitch the callback function would not find flag 
    core.util.doSomethingAsync(dojo.hitch(this, this.callback)); 
    } 
} 

Sin enganche, la función de devolución de llamada, posiblemente, podría ser ejecutado en un ámbito diferente y una se generaría un error con this.flag siendo indefinido. Sin embargo, con el enganche, se garantiza que se ejecutará dentro de execptedScopeObj.

+0

¿Qué es exactamente estás tratando de lograr? Un código de muestra sería útil – Ariel

+2

¿No debería el ejemplo haber sido dojo.hitch (this, this, callback)? – Murali

+0

Este [Hitch] (https://github.com/phiggins42/bloody-jquery-plugins/blob/master/hitch.js) El complemento jQuery se ha adaptado de Dojo – PHearst

Respuesta

44

Sé que esto ha sido respondido, pero no correctamente. jQuery.proxy es lo que estás buscando, creo.

ACTUALIZACIÓN

muchos, muchos años más tarde después de un montón de trabajo JavaScript, y después de despojar a mi uso de jQuery ya la compatibilidad del navegador se ha convertido en un problema menor, yo recomendaría usar Function.prototype.bind sobre jQuery.proxy, como @bobince suggested . Si bien esta sigue siendo la respuesta correcta a la pregunta original, me siento obligado a dirigir a las personas a una solución estándar en lugar de confiar en jQuery.

2

No. No en 1.3.2, al menos, ya que no sé acerca de 1.4. Hay, sin embargo, algunos plugins:

(function($) { 
    $.fn.hitch = function(ev, fn, scope) { 
    return this.bind(ev, function() { 
     return fn.apply(scope || this, Array.prototype.slice.call(arguments)); 
    }); 
    }; 
})(jQuery); 
+0

Intentamos, si es posible, evitar el uso de complementos solo porque preferimos usar el soporte de una biblioteca base. Parece que en este momento nuestra mejor opción es utilizar una base dojo combinada y una construcción jquery para obtener lo mejor de ambos mundos :) – Lightbeard

+0

Este es un territorio nigromante, pero para cualquier otra persona que no lo haya resuelto mira el complemento de enganche de @phiggins: https://github.com/phiggins42/bloody-jquery-plugins/blob/master/hitch.js –

+0

Aún más zombie, acabo de volver a publicar ese enlace sobre – PHearst

1

El function.bind mencionado por bobince es una herramienta muy útil. Se podría utilizar para volver a escribir la función de enganche bastante simple:

// The .bind method from Prototype.js 
if (!Function.prototype.bind) { // check if native implementation available 
    Function.prototype.bind = function(){ 
    var fn = this, args = Array.prototype.slice.call(arguments), 
     object = args.shift(); 
    return function(){ 
     return fn.apply(object, 
     args.concat(Array.prototype.slice.call(arguments))); 
    }; 
    }; 
} 

jQuery.hitch = function(scope, fn) { 
    if (typeof fn == "string") fn = scope[fn]; 
    if (fn && fn.bind) return fn.bind(scope); 
}; 

Al menos basado en la página doc se enlazó, esta es la forma en que vi la función de trabajo ...

6

[ADMIN EDITAR: Tenga en cuenta la respuesta mucho más popular, a continuación.- danorton]

Iría por function.bind, que será la forma estándar de hacer esto en versiones futuras de JavaScript. Además de la fijación de this, le permite pasar argumentos a las funciones de destino.

Hasta que todos los navegadores lo admitan de forma nativa, puede hack support in yourself.

+0

aunque bind es similar y ciertamente muy útil, no completa la tarea – Lightbeard

+0

Erm ... cumple la tarea de recuperar una función con el conjunto 'this' apropiadamente. ¿Qué más esperas que 'enganche' haga? Su código de ejemplo anterior no funciona en absoluto. – bobince

+0

Tienes razón. Lo malentendí y pensé que te referías a la función de enlace de jquery. Gracias – Lightbeard

1
//why not just: 
(function($){ 
    $.hitch = function(scope, fn){ 
    return function(){ 
     return fn.apply(scope, arguments); 
    } 
    } 
})(JQuery); 
//This works exactly like Dojo's hitch from what I can tell. 
0

En mi mente, hitch en Dojo es más complejo,

por ejemplo,

function f(a,b,c){return a+b*c} 
var newF = hitch(null,f,1,undefined,3); 
newF(2) /*1+2*3*/ 
0
/** 
* This is for simulate dojo.hitch. 
* @param $ 
*/ 
(function($) { 
    $.hitch = function(context, func) { 
     var args = Array.prototype.slice.call(arguments, 
       2/*Remove context, and func*/); 

     return function() { 
      return func.apply(context, 
        Array.prototype.concat.call(args, arguments)); 
     }; 
    }; 
})(jQuery); 
Cuestiones relacionadas