اعتبار سنج تابعی است که در فیلدها مقدار جدیدی می گیرد و سپس بر روی آن عمل می کند. آنها یک راه ساده برای سفارشی کردن یک فیلد هستند. آنها به شما اجازه می دهند وقتی مقدار یک فیلد تغییر می کند، عملکرد را فعال کنید، ورودی را تغییر دهید یا مقادیر قابل قبول را محدود کنید.
چند مثال رایج:
- محدود کردن یک فیلد متنی برای پذیرش فقط حروف.
- نیاز است که یک فیلد متنی خالی نباشد.
- الزام به این که تاریخ در آینده باشد.
- تغییر شکل یک بلوک بر اساس یک کشویی.
اعتبار سنجی ها بسته به نوع اعتبار سنجی که هستند در زمان های مختلف اجرا می شوند.
اعتبار سنجی کلاس بخشی از تعریف کلاس نوع فیلد است و معمولاً برای محدود کردن نوع مقدار مجاز فیلد استفاده می شود (مثلاً فیلدهای عددی فقط کاراکترهای عددی را می پذیرند). اعتبار سنجی کلاس بر روی تمام مقادیر ارسال شده به فیلد (از جمله مقدار ارسال شده به سازنده) اجرا می شود.
برای اطلاعات بیشتر در مورد اعتبار سنجی کلاس، بخش پیاده سازی اعتبار سنج کلاس را در ایجاد یک فیلد سفارشی ببینید.
اعتبار سنجی های محلی در زمان ساخت یک میدان تعریف می شوند. اعتبار سنجی های محلی روی تمام مقادیر ارسال شده به فیلد به جز مقدار ارسال شده به سازنده اجرا می شوند. این بدان معنی است که آنها بر روی:
- مقادیر موجود در XML
- مقادیر به setValue منتقل شدند.
- مقادیر به setFieldValue منتقل شدند.
- مقادیر توسط کاربر تغییر می کند.
اعتبار سنجی کلاس قبل از اعتبار سنجی محلی اجرا می شود زیرا آنها مانند دروازه بان عمل می کنند. آنها قبل از ارسال، مطمئن می شوند که مقدار از نوع صحیح است.
برای اطلاعات بیشتر در مورد توالی اعتبارسنجی ارزش، و مقادیر به طور کلی به مقادیر مراجعه کنید.
اعتبار سنجی های محلی را می توان به دو روش ثبت کرد:
- به طور مستقیم در سازنده یک فیلد اضافه شده است.
Blockly.Blocks['validator_example'] = {
init: function() {
// Remove all 'a' characters from the text input's value.
var validator = function(newValue) {
return newValue.replace(/\a/g, '');
};
this.appendDummyInput()
.appendField(new Blockly.FieldTextInput('default', validator));
}
};
- با setValidator .
Blockly.Blocks['validator_example'] = {
init: function() {
// Remove all 'a' characters from the text input's value.
var validator = function(newValue) {
return newValue.replace(/\a/g, '');
};
var field = new Blockly.FieldTextInput('default');
field.setValidator(validator);
this.appendDummyInput().appendField(field);
}
};
هر یک از روش های بالا را می توان در یک پسوند پیچیده کرد تا از فرمت JSON پشتیبانی کند.
مقدار فیلد بسته به نوع فیلد مورد تایید ممکن است بسیار متفاوت باشد (مثلاً یک فیلد عددی یک عدد را ذخیره میکند، در حالی که یک فیلد ورودی متن یک رشته را ذخیره میکند) بنابراین بهتر است قبل از ایجاد یک فایل مستندات مربوط به فیلد خاص خود را بخوانید. تایید کننده
مقدار بازگشتی اعتباردهنده تعیین می کند که فیلد بعدی چه کاری انجام می دهد. سه احتمال وجود دارد:
ارزش بازگشتی اصلاح شده
یک مقدار تغییر یافته یا متفاوت، که سپس به مقدار جدید فیلد تبدیل می شود. این اغلب برای پاک کردن یک مقدار استفاده می شود، مانند حذف فضای خالی انتهایی.
نمونه ای از یک اعتبارسنجی اصلاح کننده:
// Remove all 'a' characters from the text input's value.
var validator = function(newValue) {
return newValue.replace(/\a/g, '');
};
ارزش بازگشتی تهی
Null، به این معنی که مقدار داده شده نامعتبر است. در بیشتر موارد فیلد مقدار ورودی را نادیده می گیرد. رفتار دقیق توسط تابع doValueInvalid_
فیلد مشخص می شود.
نمونه ای از اعتبار سنجی نال:
// Any value containing a 'b' character is invalid. Other values are valid.
var validator = function(newValue) {
if (newValue.indexOf('b') != -1) {
return null;
}
return newValue;
};
مقدار بازگشتی تعریف نشده
تعریف نشده (یا بدون دستور بازگشت) یا مقدار ورودی، به این معنی که مقدار ورودی باید به مقدار جدید فیلد تبدیل شود. این نوع اعتباردهنده ها عموماً به عنوان شنوندگان تغییر عمل می کنند.
نمونه ای از اعتبارسنجی شنونده:
// Log the new value to console.
var validator = function(newValue) {
console.log(newValue);
};
یک بار دیگر توجه کنید که چگونه متن نمایش داده شده لزوماً مقدار فیلد را منعکس نمی کند.
در داخل یک اعتبار سنج، this
به فیلد اشاره دارد، نه بلوک. اگر نیاز به دسترسی به بلوک در داخل اعتبارسنجی دارید از تابع getSourceBlock
استفاده کنید. همچنین می توانید از تابع bind برای تنظیم زمینه ای که اعتبار دهنده در آن فراخوانی می شود استفاده کنید.
نمونه کد با استفاده از getSourceBlock
:
Blockly.Blocks['colour_match'] = {
init: function() {
this.appendDummyInput()
.appendField(new Blockly.FieldColour(
null, this.validate
), 'COLOUR');
this.setColour(this.getFieldValue('COLOUR'));
},
validate: function(colourHex) {
this.getSourceBlock().setColour(colourHex);
}
};
کد نمونه با استفاده از bind :
Blockly.Blocks['colour_match'] = {
init: function() {
this.appendDummyInput()
.appendField(new Blockly.FieldColour(
null, this.validate.bind(this)
), 'COLOUR');
this.validate(this.getFieldValue('COLOUR'));
},
validate: function(colourHex) {
this.setColour(colourHex);
}
};