اتصال با dojo.hitch

api.dojotoolkit – docs.dojocampus

به زبان ساده

dojo.hitch(foo, "bar")();
//runs foo.bar() in the scope of foo
dojo.hitch(foo, myFunction);
//returns a function that runs myFunction in the scope of foo


بعضی اوقات احتیاج داریم یک متد از یک شیء به عنوان آرگومان به تابع دیگر بدیم.خیلی از برنامه نویسا خسته می شن از بس برای حل این مشکل مینویسن

somFunction(somObject.someMethod)

و نتیجه هم نمی گیرن ، dojo.hitch این مشکل حل کرده

بزارین یک تلاش ساده برای همین مشکلی که گفتم انجام بدیم و متد m از شی o را به عنوان آرگومان به تابع دیگری ارسال کنیم،o.m صداش می کنیم.یه مثال ساده از یک اکومولاتور که جمع می کنه و نتیجه بازگشت میده.تو این کد theAccumulator.getResult همون o.m هست

var theAccumulator= {
	total: 0,
	clear: function() {
		this.total= 0;
	},
	add: function(x) {
		this.total+= x;
	},
	getResult: function() {
		return this.total;
	}
};

بعد به تابعی احتیاج داریم که تابعی دیگر را (یعنی theAccumulator.getResult) به عنوان ورودی گرفته و نتیجه بازگشتی رو نمایش بده:
الان ما ۱۰۰ و ۲۰۰ اضافه میکنیم و نتیجه را با عبور دادن theAccumulator.getResult در تابع printResult چاپ میکنیم.شاید خیلی از برنامه نویسا اینجور عمل کنند.

theAccumulator.clear();
theAccumulator.add(100);
theAccumulator.add(200);
printResult(theAccumulator.getResult);

ما انتظار داریم پیغام “result= 300” نمایش داده شود ولی “result= undefined” دیده می شود.مشکل همینجاست:وقتی theAccumulator.getResult به تابع printResult ارسال می شود ، تابع هیچ مقداری ندارد.وقتی پارامتر f بوسیله تابع printResult احضار می شود.this ارجاع داده میشه به یک شیء گلوبال و متغیر گلوبال total [ارزیابی | سنجیده ] میشه ، نه متغیر total در شیء theAccumulator که منظور ما بوده است.این مشکل میتونه به این صورت حل بشه:

printResult(function(){return theAccumulator.getResult();});

وقتی تابع function(){return theAccumulator.getResult();} توسط printResult فراخوانی میشه ، ما صراحتا getResult از شیء theAccumulator فراخوانی می کنیم.
تابع dojo.hitch میتونه یک یا دو یا … ورودی بگیره .اگر ۲ ورودی بگیره آرگومان اول به عنوان یک شیء و آرگومان دوم به عنوان یک رشته یا تابع است.

printResult(dojo.hitch(theAccumulator, "getResult" ));

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *