2010-01-09 2 views
16

Простите мое невежество, поскольку я не так хорошо знаком с jquery. Есть ли эквивалент dojo.hitch()? Он возвращает функцию, которая, как гарантируется, будет выполняться в заданной области.У jquery есть эквивалент dojo.hitch()?

- изменение - В соответствии с просьбой, приведен пример. Я использую автомат очень часто, чтобы гарантировать, что обратные вызовы выполняются в нужном объекте. Например, предположим, что у меня есть метод утилиты, называемый doSomethingAsync, и я передаю ему функцию обратного вызова. С сцепки, можно убедиться, что функция выполняется в пределах определенной области, даже если метод утилита выполняет Ajax вызовов и так далее:


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)); 
    } 
} 

Без сцепки, функция обратного вызова, возможно, может быть выполнена в различном объеме и ошибка будет сброшена с this.flag не определено. Однако с зацепкой гарантируется выполнение в пределах execptedScopeObj.

+0

Что именно вы пытаетесь достичь? Пример кода был бы полезен – Ariel

+2

Не должен ли быть пример dojo.hitch (это, это, обратный вызов)? – Murali

+0

Этот [Hitch] (https://github.com/phiggins42/bloody-jquery-plugins/blob/master/hitch.js) Плагин jQuery адаптирован из Dojo – PHearst

ответ

44

Я знаю, что на это был дан ответ, но не правильно. jQuery.proxy - это то, что вы ищете, я верю.

UPDATE

Много, много лет спустя после того, как много работы JavaScript, и после удаления моего использования JQuery, так как совместимость браузера стала менее важной проблема, я бы рекомендовал использовать Function.prototype.bind над jQuery.proxy как @bobince suggested , Хотя это по-прежнему правильный ответ на исходный вопрос, я чувствую себя обязанным направлять людей к ванильному решению, а не полагаться на jQuery.

2

№ Не в 1.3.2, по крайней мере, так как я не знаю о 1.4. Есть, однако, некоторые 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

Мы пытаемся, если вообще возможно, избегать использования плагинов только потому, что мы предпочитаем идти с поддержкой базовой библиотеки. Похоже, сейчас самое лучшее - использовать комбинированную базу dojo и jquery build, чтобы мы получили лучшее из обоих миров :) – Lightbeard

+0

Это территория некромантов, но для тех, кто еще не решил это, вы можете посмотрите на плагин с защелкой @phiggins: https://github.com/phiggins42/bloody-jquery-plugins/blob/master/hitch.js –

+0

Еще больше зомби-подобных, я просто переписал эту ссылку выше – PHearst

1

function.bind упоминается bobince является довольно полезным инструментом. Вы можете использовать его, чтобы переписать функцию сцепки довольно просто:

// 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); 
}; 

По крайней мере, на основе странице дока вы связаны, это, как я видел функцию рабочей ...

6

[ADMIN EDIT: Обратите внимание на гораздо более популярный ответ, ниже. - danorton]

Я бы выбрал function.bind, что будет стандартным способом сделать это в будущих версиях JavaScript. Помимо исправления this, он позволяет передавать аргументы через целевые функции.

До тех пор, пока все браузеры не поддерживают его изначально, вы можете hack support in yourself.

+0

, хотя bind похож и конечно, очень полезный, он не совсем выполняет задачу. – Lightbeard

+0

Erm ... он выполняет задачу надлежащего вызова функции с помощью этого набора. Что еще вы ожидаете от «hitch»? Ваш примерный код выше не работает вообще. – bobince

+0

Вы правы. Я неправильно понял и думал, что вы ссылаетесь на функцию привязки jquery. благодаря – 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

На мой взгляд, hitch в додзё является более сложным,

например,

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); 
Смежные вопросы