2010-01-09 42 views
16

Tha thứ sự thiếu hiểu biết của tôi vì tôi không quen thuộc với jquery. Có tương đương với dojo.hitch() không? Nó trả về một hàm được đảm bảo thực hiện trong phạm vi đã cho.jquery có tương đương với dojo.hitch() không?

- chỉnh sửa - Theo yêu cầu, đây là một ví dụ. Tôi sử dụng hitch rất thường xuyên để đảm bảo callbacks được thực hiện trong đối tượng bên phải. Ví dụ, giả sử tôi có một phương thức tiện ích được gọi là doSomethingAsync và tôi chuyển cho nó một hàm gọi lại. Với hitch, tôi có thể đảm bảo các chức năng được thực hiện trong một phạm vi đặc biệt ngay cả khi phương pháp hữu ích thực hiện các cuộc gọi ajax và vân vân:


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

Không xô, chức năng gọi lại có thể có thể được thực hiện trong một phạm vi khác nhau và một lỗi sẽ bị ném với this.flag không được xác định. Tuy nhiên, với hitch nó được đảm bảo để được thực hiện trong vòng execptedScopeObj.

+0

biết chính xác là bạn đang cố gắng để thực hiện? Mã mẫu sẽ hữu ích – Ariel

+2

Chẳng phải ví dụ này phải là dojo.hitch (cái này, cái này, gọi lại)? – Murali

+0

[Hitch] này (https://github.com/phiggins42/bloody-jquery-plugins/blob/master/hitch.js) jQuery plugin được điều chỉnh từ Dojo – PHearst

Trả lời

44

Tôi biết điều này đã được trả lời, nhưng không chính xác. jQuery.proxy là những gì bạn đang tìm kiếm Tôi tin tưởng.

CẬP NHẬT

Nhiều, nhiều năm sau đó sau khi rất nhiều công việc JavaScript, và sau khi tước ra sử dụng của tôi của jQuery từ khả năng tương thích trình duyệt đã trở nên ít của một vấn đề, tôi sẽ khuyên bạn sử dụng Function.prototype.bind qua jQuery.proxy, như @bobince suggested . Trong khi đây vẫn là câu trả lời đúng cho câu hỏi ban đầu, tôi cảm thấy có nghĩa vụ hướng mọi người đến một giải pháp vani thay vì dựa vào jQuery.

2

Không. Không phải trong 1.3.2, ít nhất, vì tôi không biết khoảng 1.4. Tuy nhiên, một số 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

Chúng tôi cố gắng hết sức để tránh sử dụng plugin chỉ vì chúng tôi muốn đi với sự hỗ trợ của thư viện cơ sở. Có vẻ như ngay bây giờ đặt cược tốt nhất của chúng tôi là sử dụng cơ sở dojo kết hợp và xây dựng jquery để chúng ta có được tốt nhất của cả hai thế giới :) – Lightbeard

+0

Đây là lãnh thổ necromancer, nhưng đối với bất kỳ ai chưa giải quyết được điều này, bạn có thể nhìn vào plugin hitch @phiggins ': https://github.com/phiggins42/bloody-jquery-plugins/blob/master/hitch.js –

+0

Thậm chí nhiều zombie hơn, tôi chỉ đăng lại liên kết ở trên – PHearst

1

Các function.bind đề cập bởi bobince là một công cụ khá hữu ích. Bạn có thể sử dụng nó để viết lại các chức năng hitch khá đơn giản:

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

Ít nhất dựa trên trang doc bạn liên kết, đây là cách tôi nhìn thấy chức năng làm việc ...

6

[ADMIN EDIT: Lưu ý câu trả lời phổ biến hơn nhiều, bên dưới.— danorton]

Tôi muốn đi theo số function.bind, đây sẽ là cách tiêu chuẩn để thực hiện việc này trong các phiên bản JavaScript sau này. Cũng như sửa lỗi this, nó cho phép bạn chuyển đối số qua các hàm đích.

Cho đến khi tất cả trình duyệt hỗ trợ nguyên bản, bạn có thể hack support in yourself.

+0

mặc dù liên kết là tương tự và chắc chắn rất hữu ích, nó không hoàn thành nhiệm vụ – Lightbeard

+0

Erm ... nó hoàn thành nhiệm vụ gọi lại một hàm với 'this' được đặt một cách thích hợp. Bạn còn mong đợi điều gì khác nữa? Mã ví dụ của bạn ở trên không hoạt động chút nào. – bobince

+0

Bạn nói đúng. Tôi hiểu lầm và nghĩ rằng bạn đang đề cập đến chức năng ràng buộc của jquery. Cảm ơn – 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

Trong tâm trí của tôi, hitch trong Dojo là phức tạp hơn,

ví dụ

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); 
Các vấn đề liên quan