בחירת השיטות שעברו בירושה לפעולות על נתונים, לצורך דריסה

כל פעולה על נתונים חייבת לממש שיטות שונות כדי לפעול כראוי, כך שרק תצטרך לדרוס את אותן השיטות המממשות התנהגות שברצונך לשנות.

שיטות כלליות

אם תרחיב אחת מהמחלקות של פעולה קונקרטית על נתונים, לדוגמה HTTPAPIDataAction, אזי רוב השיטות הדרושות כבר ממומשות ורק תצטרך לדרוס את השיטות המממשות את ההתנהגות שברצונך לשנות.

חלק זה מתאר את השיטות השונות ולמה ניתן לצפות מהן.

כל סוגי הפעולה על נתונים חייבים לממש את השיטות המתוארות כאן.

create(sID, sName)

מתבצעת קריאה לשיטה הסטטית create() כאשר יוצרים פעולה על נתונים חדשים ובוחרים סוג פעולה על נתונים מהתפריט הנפתח. שיטה זו אחראית על:

  • בניית מחלקת מודל הנוקאאוט שבה משתמשת הפעולה על הנתונים.

    למחלקת 'מודל נוקאאוט' חייבים להיות מזהה ושם שהועברו אל השיטה create() ביחד עם ברירות מחדל הגיוניות לכל המאפיינים האחרים. לדוגמה, לפעולה על נתוני המרת מטבע ייתכן שתרצה להגדיר את ברירת המחדל של המטבע כדולר. מודל הנוקאאוט הוא המקום הנכון שמספק לך את ערכי ברירת המחדל שלך.

  • בניית מופע של הפעולה על הנתונים ממודל הנוקאאוט.
  • החזרת המופע של הפעולה על הנתונים.

invoke(oActionContext, oDataActionContext)

מתבצעת קריאה לשיטה invoke() כאשר המשתמש מפעיל את הפעולה נתונים מתפריט ההקשר לנקודת נתונים בהמחשה גרפית. השיטה מעבירה את הארגומנט DataActionContext שמכיל מטאדטה לתיאור נקודות הנתונים שנבחרו, ההמחשה הגרפית, המסננים, חוברת העבודה ומושב העבודה שנבחרו. ראה מחלקות שירות פעולה על נתונים.

validate()

מתבצעת קריאה לשיטה validate() בכל פעולה על נתונים כאשר המשתמש לוחץ על אוקיי בתיבת הדו-שיח פעולות על נתונים. השיטה validate() מחזירה ערך null כדי לציין שהכול תקף או ערך DataActionError אם משהו אינו תקף. אם יש שגיאה באחת מהפעולות על נתונים בתיבת הדו-שיח, השגיאה מונעת את סגירת התיבה והודעת שגיאה מוצגת למשתמש. שיטה זו בודקת את התקינות של שם הפעולה על נתונים באמצעות השיטה this.validateName().

getGadgetInfos(oReport)

מתבצעת קריאה לשיטה getGadgetInfos() כדי לאפשר לממשק המשתמש להציג שדות מאפיינים של פעולה על נתונים. השיטה מחזירה מערך של GadgetInfos לפי הסדר שבו תרצה שיופיעו בממשק המשתמש. אביזרים מסופקים לכל סוגי השדות הנפוצים ביותר (לדוגמה, טקסט, רשימה נפתחת, סיסמה, בחירות מרובות, כפתור רדיו, תיבת תיוג). עם זאת תוכל ליצור אביזרים בהתאמה אישית אם תרצה שדות מורכבים יותר (לדוגמה, שדות שבהם מקובצים מספר אביזרים יחד, או היכן ששדות אביזר שונים מוצגים בהתאם לאפשרות שבחרת). נוהל מומלץ הוא ליצור שיטה שבונה כל GadgetInfo שתרצה במערך שלך, כיוון שזה קל יותר לתת-מחלקות פוטנציאליות לבחור מתוך GadgetInfos שסיפקת. אם תאמץ נוהל זה, כבר יש שיטת שונות שמומשו לפי מחלקות בסיס שונות של פעולה על נתונים, שיכולות להחזיר GadgetInfo לכל אחד מהשדות שבהם הן משתמשות בממשקי המשתמש שלהן. אם תצטרך גם אחד מ-GadgetInfos אלה, עליך לקרוא לשיטה המתאימה create****GadgetInfo() ולדחוף את הערך המוחזר שלה למערך הגאדג'טים שלך.

isAllowedHere(oReport)

מתבצעת קריאה לשיטה isAllowedHere() כאשר המשתמש לוחץ לחיצה ימנית על נקודת נתונים בהמחשה גרפית וממשק המשתמש מתחיל להפיק את תפריט ההקשר. אם קיימת פעולה על נתונים שהיא רלוונטית לנקודות הנתונים שנבחרו, השיטה מחזירה true והפעולה על נתונים מופיעה בתפריט ההקשר. אם השיטה מחזירה false, הפעולה על הנתונים לא מופיעה בתפריט ההקשר. מומלץ לקבל את ברירת המחדל של ההתנהגות שעברה בירושה ממחלקת-העל.

upgrade(oOldDataActionJS)

אם אתה יוצר את הפעולה הראשונה על נתונים, אין להשתמש בשיטה upgrade(oOldDataActionJS). השתמש בשיטה זו רק אחרי שיצרת את מודל הנוקאאוט הראשון ואתה מבצע שינויים משמעותיים במאפיינים לגרסה השנייה של מודל הנוקאאוט. לדוגמה, אם הגרסה הראשונה של הפעולה על נתונים מאחסנת כתובת URL במודל הנוקאאוט שלה, אבל אתה מחליט שהגרסה הבאה תאחסן חלקי רכיב של כתובת URL במאפיינים נפרדים (לדוגמה, protocol, hostname, port, path, queryString ו-bookmark).

הגרסה השנייה של מודל הנוקאאוט תדרוש לפתוח פעולה על נתונים שנשמרה עם הגרסה הראשונה של קוד מודל הנוקאאוט, ודבר זה עשוי לגרום לבעיות. לפתרון בעיה זו, המערכת מזהה שהגרסה הנוכחית של קוד הפעולה חדשה יותר מהפעולה שנפתחת, והיא קוראת לשיטה upgrade() על מחלקת הפעולה החדשה ומעבירה פנימה את מודל הנוקאאוט של הפעולה הישנה (הפך לאובייקט JSON סדרתי). לאחר מכן תוכל להשתמש באובייקט JSON הישן כדי לאכלס את מודל הנוקאאוט החדש שלך ולהחזיר גרסה משודרגת של אובייקט ה-JSON. דבר זה מבטיח שהמטאדטה של הפעולה הישנה על הנתונים ממשיך לפעול בזמן שאתה משפר את קוד הפעולה שלך.

שיטות HTTPAPIDataAction

אם תרחיב את המחלקה HTTPAPIDataAction, היא תספק את השיטה הנוספת הבאה שאותה אולי תבחר לדרוס:

getAJAXOptions(oDataActionContext)

מתבצעת קריאה לשיטה getAJAXOptions() באמצעות השיטה invoke() של הפעולה על הנתונים. השיטה getAJAXOptions() יוצרת את האובייקט אפשרויות AJAX המתאר את בקשת ה-HTTP שברצונך שהפעולה על הנתונים תבצע. השיטה getAJAXOptions() מעבירה את האובייקט oDataActionContext שמכיל את המטאדטה המתארים את נקודות הנתונים, ההמחשה הגרפית, המסננים, חוברת העבודה ומושב העבודה. הגדר את אפשרויות AJAX כדרוש על-ידי ה-HTTP API שעמו אתה מנסה להשתלב, וציין את הפונקציות שלהן תרצה לקרוא כאשר HTTPRequest מסתיימת בהצלחה או בשגיאה. עיין באתר האינטרנט של JQuery לקבלת הסבר על אובייקט ה-jQuery.ajax והמאפיינים שלו.

המימוש הבא עבר בירושה מהמחלקה HTTPAPIDataAction. יהיה עליך לכתוב מחדש את השיטה שעברה בירושה כדי לציין את הדרישות. לדוגמה, יצירת בקשת ה-HTTP והקוד שמטפל בתגובת ה-HTTP. זהו מימוש יעיל כיוון שהוא מראה את הפרמטרים שהועברו לפונקציה getAJAXOptions() ואת האובייקט הצפוי לחזור, וגם נותן דוגמה ברורה כיצד לבנות את הקוד בתוך השיטה.

1 /**
2  * This method returns an object containing the AJAX settings used when the data action is invoked. 
3  * Subclasses may wish to override this method to provide their own behavior. 
4  * @param {module:obitech-reportservices/dataactionmanager.DataActionContext} oDataActionContext The context metadata describing where the data action was invoked from.  
5  * @returns {?object} A JQuery AJAX settings object (see http://api.jquery.com/jQuery.ajax/ for details) - returns null if there is a problem. 
6  */
7 dataaction.HTTPAPIDataAction.prototype.getAJAXOptions = function (oDataActionContext)
8 {
9    jsx.assertInstanceOfModule(oDataActionContext, "oDataActionContext", "obitech-reportservices/dataactionmanager", "DataActionContext");
10   
11   var oAJAXOptions = null;   
12   var oKOViewModel = this.getKOViewModel();
13   var sURL = oKOViewModel.sURL();
14   if (sURL)
15   {
16      // Parse the URL
17      var sResultURL = this._parseURL(sURL, oDataActionContext);
18      if (sResultURL)
19      {
20         // Parse the POST parameters (if required)
21         var eHTTPMethod = oKOViewModel.eHTTPMethod()[0];
22         var sData = null;
23         if (eHTTPMethod === dataaction.HTTPDataActionKOModel.HTTPMethod.POST)
24         {
25            var sPOSTParams = oKOViewModel.sPOSTParams();
26            sData = sPOSTParams.replace(dataaction.AbstractHTTPDataAction.RegularExpressions.LINE_END, "&");
27            sData = this._parseURL(sData, oDataActionContext, false);
28         }
29         oAJAXOptions = {
30            type: eHTTPMethod,
31            url: sResultURL,
32            async: true,
33            cache: false,
34            success: function (/*oData, sTextStatus, oJQXHR*/)
35            {
36               oDataActionContext.getReport().displaySuccessMessage(messages.HTTP_API_DATA_ACTION_INVOCATION_SUCCESSFUL.format(oKOViewModel.sName()));
37            },
38            error: function (oJQXHR/*, sTextStatus, sError*/)
39            {
40               oDataActionContext.getReport().displayErrorMessage(messages.HTTP_API_DATA_ACTION_INVOCATION_FAILED.format(oKOViewModel.sName(), oJQXHR.statusText, oJQXHR.status));
41            }
42         };
43         if (sData)
44         {
45            oAJAXOptions.data = sData;
46         }
47      }
48   }
49   return oAJAXOptions;
50 };