مكتبة Webix JavaScript من خلال عيون مبتدئ. الجزء 4. العمل مع البيانات. الخام



أنا مطور أمامي مبتدئ. أنا الآن أدرس وتدرب في شركة تكنولوجيا معلومات مينسك. يتم تعلم أساسيات واجهة مستخدم الويب باستخدام مكتبة 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 () . تأخذ الطريقة معلمتين: معرف العنصر المحدد ومجموعة من الخصائص الجديدة المأخوذة من النموذج. عندما يتم استدعاء الوظيفة ، يتم استبدال البيانات الحالية واستكمالها بأخرى جديدة.

نتيجة:



الخطوة 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”، للإشارة إلى الحقل الذي يمكن تحريره.

نتيجة:



الخطوة 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);
};

نتيجة:



الخطوة 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. يتم تنفيذ الأساليب مع بضعة أسطر من التعليمات البرمجية. تجعل بنية المكتبة من السهل الجمع بين الوظائف المختلفة مع بعضها البعض.

Source: https://habr.com/ru/post/undefined/


All Articles