أنا مطور أمامي مبتدئ. أنا الآن أدرس وتدرب في شركة تكنولوجيا معلومات مينسك. يتم تعلم أساسيات واجهة مستخدم الويب باستخدام مكتبة Webix JS كمثال ، وأريد مشاركة تجربتي المتواضعة وحفظها كبرنامج تعليمي صغير لمكتبة واجهة المستخدم المثيرة للاهتمام هذه.التحدي الرابع
عند العمل باستخدام البيانات ، من المهم أن تكون قادرًا على تنفيذ عدة أنواع من العمليات. في تطوير الويب ، CRUD مسؤولة عن هذا - أربع وظائف أساسية. تحتوي مكتبة Webix على جميع الأدوات اللازمة لتطبيق CRUD. الأساس من أجل حل المشاكل الجديدة سوف تكون لي كمادة من المنشورات السابقة: خلق واجهة التطبيق ، وحدات المشروع و العمل مع النماذج .ستغطي هذه المقالة المهام التالية:- تحرير بيانات الجدول من خلال نموذج ؛
- تركيب محرر الخط المدمج ؛
- إضافة البيانات إلى القائمة والمخطط ؛
- حذف العناصر؛
في الوثائق ، يمكنك العثور على عناصر واجهة استخدام القائمة ، Treetable ، Table المستخدمة في المقالة .المصادر على الرابط .يمكن العثور على التطبيق التجريبي الناتج هنا .الخطوة 1. تحرير البيانات من خلال النموذج
في هذه الخطوة ، سأعمل مع علامة التبويب "لوحة التحكم" التي يتم فيها رسم الجدول والنموذج. كود الجدول موجود في ملف table.js ، كود النموذج موجود في form.js.في مقالة " العمل مع النماذج " ، تمت إضافة إدخالات جديدة باستخدام طريقة add () ، والتي تم استكمالها بالتحقق من صحة النموذج. الآن سيتم استخدام النموذج لتحرير الإدخالات. جدولالحاجيات أنا أضيف حدث onAfterSelect . عندما يتم تشغيل هذا الحدث ، سوف أتلقى بيانات من الجدول ونقلها إلى حقول النموذج.const table = {
view:"datatable",
id:"film_list",
scroll:"y",
select:true,
url:"data/data.js",
hover:"myhover",
columns:[
{ id:"rank", header:"", width:50, css:"rank"},
{ id:"title", header:"Film title", fillspace:true},
{ id:"year", header:"Released", width:100},
{ id:"votes", header:"Votes", width:100},
{ id:"rating", header:"Rating", width:100}
],
on:{
onAfterSelect(id){
let values = $$("film_list").getItem(id);
$$("film_form").setValues(values)
}
}
}
طريقة setValues () ، في الكود أعلاه ، مسؤولة عن تمرير القيم المستلمة إلى النموذج.أقوم بتشغيل الكود والتحقق من النتيجة:
بمجرد تحديد صف في الجدول ، يتم إدخال بياناته تلقائيًا في النموذج وتكون جاهزة للعمل.الآن أعقد العملية: سيتم إضافة السجل الجديد ، كما كان من قبل ، إلى الجدول. إذا تم أخذ البيانات من الجدول وتحريرها ، ثم أحفظ هذه التغييرات. سأعيدكتابة وظيفة saveItem وأضيف إليها طرقًا جديدة:let saveItem = () => {
let form = $$( "film_form" );
let list = $$( "film_list" );
let item_data = $$("film_form").getValues();
if( form.isDirty() && form.validate() ){
if( item_data.id )
list.updateItem(item_data.id, item_data);
else
list.add( item_data );
}
}
تحتوي الوظيفة الآن على الخوارزمية التالية:- في البداية ، يبدأ التحقق لشرطين - ما إذا كانت بيانات النموذج اجتازت عملية التحقق وما إذا كان النموذج قد تغير. تتم مراقبة التغييرات في النموذج بواسطة طريقة isDirty () ؛
- بعد ذلك ، يسمح لك الشرط "item_data.id" بتعريف سجل جديد. يتم إرسال سلسلة إلى النموذج مع جميع بياناته ، بما في ذلك المعرف ، والتي لا يوجد لها حقل نص في النموذج ، ولكنها مطلوبة للبيانات. يخزن النموذج ويسمح لك بقراءة جميع القيم المرسلة ، لذلك نستخدم معرف للتحقق ؛
- بعد التوفيق بين السجلات ، تتم إضافة سجل جديد - بواسطة طريقة add () ، أو يتم تحديث العنصر الحالي بخصائص جديدة.
لتحديث البيانات المحررة ، يتم استخدام طريقة updateItem () . تأخذ الطريقة معلمتين: معرف العنصر المحدد ومجموعة من الخصائص الجديدة المأخوذة من النموذج. عندما يتم استدعاء الوظيفة ، يتم استبدال البيانات الحالية واستكمالها بأخرى جديدة.نتيجة:![](https://habrastorage.org/webt/ti/vs/eb/tivsebetxl7dvn8q7gxfebx_w9c.png)
الخطوة 2. تثبيت المحرر المدمج
في الخطوة السابقة ، فكرت في خيار تعديل بيانات الجدول باستخدام نموذج. لكن النموذج الموجود على الصفحة ليس مطلوبًا دائمًا ، لذلك أقوم بتطبيق طريقة التحرير مباشرة في العنصر. هذه الطريقة قابلة للتطبيق في كل من الجدول والمكونات الأخرى للعمل مع كميات كبيرة من البيانات - على سبيل المثال ، في قائمة.سأبدأ بعرض شجرة في علامة التبويب " المنتجات ". كود الجدول موجود في ملف products_module.js. يتيح لكعنصر واجهة مستخدم Treetable تحرير محتويات الجداول ، ولكن يتم تعطيل هذه الوظيفة بشكل افتراضي. يتم تكوين التحرير في مكانين: في تكوين الجدول editable:true
، في التكوين ، وفي تكوين كل عمود. مكبرات الصوت تم إعدادها editor:”text”
. تحدد السمة "text" نوع المحرر. لمزيد من المعلومات حول أنواع المحرر ، انظرالتوثيق .const products = {
editable:true,
view:"treetable",
scrollX:false,
columns:[
{ id:"id", header:"", width:50 },
{ id:"title", header:"Title", fillspace:true,
template:"{common.treetable()} #title#", editor:"text" },
{ id:"price", header:"Price", width:200, editor:"text" }
],
select:"row",
url:"data/products.js",
rules:{
"price":webix.rules.isNotEmpty,
"title":webix.rules.isNotEmpty
}
}
في الكود ، أضفت محررين لأعمدة العنوان والسعر. بالنقر على أي خلية ، سيتم فتح محرر فيها - حقل نصي: سأنتقل
الآن إلى علامة التبويب " المستخدمون " ، وسأحلل خيار تعديل أداة القائمة . كود الأداة موجود في ملف users_module.js.تحرير البيانات متاح بشكل افتراضي لعناصر واجهة استخدام TreeTable و DataTable. لاستخدام المحرر المدمج في أدوات أخرى ، يمكنك استخدام وحدة EditAbility الخاصة . أستخدم هذه الوحدة لتحرير بيانات عنصر واجهة المستخدم List. للقيام بذلك ، استنادًا إلى عنصر واجهة مستخدم LIst ، سأقوم بإنشاء مكون مخصص باستخدام طريقة protoUI .أكتب اسم - خاصية الاسم - لعنصر واجهة المستخدم المستقبلي وأرث الوحدات اللازمة لعنصر واجهة المستخدم الأساسي.النموذج الأولي لأداة القائمة:webix.protoUI({
name:"editlist"
}, webix.EditAbility, webix.ui.list);
بعد استدعاء protoUI ، أحصل على المكون النهائي. يتم تضمينه في عنصر واجهة المستخدم بنفس طريقة جميع العناصر الأخرى - عن طريق الإعداد view:"editlist"
.view: "editlist",
editable:true,
editor:"text",
editValue:"name",
id:"user_list",
select:true,
url:"data/users.js",
template:"#name# from #country# <span class='webix_icon wxi-close'></span> "
}
نظرًا لأنه يمكن أن يكون هناك العديد من الحقول في كل سجل ، ويتم عرض الاسم والبلد مرة واحدة في ورقة القالب ، تتم إضافة - الإعداد في التكوين editorValue:”name”
، للإشارة إلى الحقل الذي يمكن تحريره.نتيجة:![](https://habrastorage.org/webt/tj/2s/6a/tj2s6a17c1dd3ezvauobwlpl0po.png)
الخطوة 3. إضافة البيانات إلى القائمة والمخطط
يستخدم هذا الجزء من المقالة قائمة ومخططات. الأدوات ، التي يوجد رمزها في ملف users_module.js ويتم تقديمها في علامة التبويب " المستخدمون ".تستخدم عناصر واجهة استخدام الرسوم البيانية والقائمة نفس البيانات - صفيف JSON. لذلك ، عندما أقوم بتطبيق القدرة على إضافة البيانات ، فمن الضروري أن تقع في كلا المكونين.للقيام بذلك ، في وحدة المستخدمين ، سوف أرسم الزر "إضافة شخص جديد".{
cols:[
{
view:"button",
id:"btn_add_person",
value:"Add new person",
width:150, css:"webix_primary",
click:addPerson
},
{}
]
}
يؤدي النقر فوق الزر إلى استدعاء وظيفة addPerson لإضافة سجل جديد إلى القائمة.يعرض الرسم البياني عمر كل سجل ، لذلك سيتم إنشاء رقم عشوائي لانتشار أكبر.وظيفة لإضافة رقم قياسي جديد:let addPerson = () => {
let obj = {
name:"Some name",
age:Math.floor(Math.random() * 80) + 10,
country:"Some country"
}
$$("user_list").add(obj);
$$("chart").add(obj);
};
نتيجة:![](https://habrastorage.org/webt/ha/k8/gj/hak8gjpeskx5w6v36cjlqav2oyy.png)
الخطوة 4. حذف العناصر
سيتم إظهار إزالة العناصر باستخدام أداة القائمة كعلامة تبويب المستخدمون وأداة الجدول كعلامة تبويب لوحة المعلومات .بادئ ذي بدء ، في عنصر واجهة تعامل الجدول ، سوف أقوم بإنشاء عمود جديد سأضع فيه علامة html مع الرمز.لتتبع النقرات على الرموز ، تحتاج إلى استخدام خاصية الجدول onClick . هذا كائن يقوم بتخزين المعالجات المرتبطة بالعناصر وفقًا لأحد فئات CSS - لدي "delete_icon"
.لمعالجة النقرات على الأيقونات ، آخذ فئة delete_icon الخاصة بها وأكتبها إلى كائن onClick كمفتاح ، ستكون قيمة هذا المفتاح دالة - معالجنا. من بين الحجج يأتي معرف السجل ، لذلك لا شيء يمنع إزالته باستخدام طريقة remove () .رمز عنصر واجهة تعامل الجدول:const table = {
view:"datatable",
id:"film_list",
scroll:"y",
select:true,
url:"data/data.js",
hover:"myhover",
columns:[
{ id:"rank", header:"", width:50, css:"rank"},
{ id:"title", header:"Film title", fillspace:true},
{ id:"year", header:"Released", width:100},
{ id:"votes", header:"Votes", width:100},
{ id:"rating", header:"Rating", width:100},
{ header:"", template:"<span class='webix_icon wxi-close delete_icon'></span>",
width:35}
],
onClick:{
delete_icon(e, id){
this.remove(id);
return false;
}
},
on:{
onAfterSelect(id){
let values = $$("film_list").getItem(id);
$$("film_form").setValues(values)
}
}
}
خوارزمية حذف الصف لعنصر واجهة تعامل القائمة هي نفسها لعنصر واجهة تعامل الجدول:{
view: "editlist",
editable:true,
editor:"text",
editValue:"name",
id:"user_list",
select:true,
url:"data/users.js",
template:`#name# from #country#
<span class='webix_icon wxi-close delete_icon'></span> `,
onClick:{
delete_icon(e, id){
this.remove(id);
return false;
}
}
},
نتيجة حذف الأسطر في علامة التبويب المستخدمون: يمكنك
العثور على التطبيق النهائي هنا .استنتاج
يتم تنفيذ CRUD باستخدام مكتبة jix من Webix بطرق مختلفة: هناك محررين مدمجين لتغيير البيانات ، وواجهة برمجة تطبيقات تسمح لك بالقيام بنفس الشيء ، ولكن من خلال نموذج جهة خارجية. تحتوي إضافة البيانات على سيناريوهات مختلفة ، وفي النموذج يمكنك تنفيذ مجموعة كاملة من وظائف CRUD. يتم تنفيذ الأساليب مع بضعة أسطر من التعليمات البرمجية. تجعل بنية المكتبة من السهل الجمع بين الوظائف المختلفة مع بعضها البعض.