אנגולר JS - שירותים (אשמח לביאור העניין)
-
@יוסף-בן-שמעון
אנסה להסביר את עצמי...אני מכיר גם קצת את אנגולר (2-8)
שם זה עובד בclass,
כמחלקה מופעלת מופעלות הפונקציות הבונות שלה כמו קונסטרקטור (באנגולר יש עוד פונקציות ע"פ מחזור החיים של המחלקה).
כאן אני לא מבין מה נעשה לפני מה ומה יחזור,אדגום דוגמא (אמיתית)
אני מעוניין לגשת עם השירות לאתר הוורדפרס שלי ולמשוך משם את כל הפוסטים
בעצם אני צריך את הפונקצייה שתמשוך את הפוסטים + משתנה שיכיל את התגובה.דטהאם אני יכניס את הפונקציה בתור הretrun כמו זה:
app.factory('posts',['$http', function($http){ return{ getPosts: function(limit , count = 0){ var response = $http({ method: 'post', url: get_posts_object.ajaxurl, params:{ action: 'get_posts', limit: limit, count: count, nonce: get_posts_object.nonce }, }).then(function(response){ return response.data; }); return response; } } }]);
אז בכל קריאה לשירות תתבצע המשיכה, ולא לזו כוונתי.
ואם הפונקציה בחוץ מי מפעיל אותה בתחילתה ומשים את תגובתה במשתנה.בקיצער
אשמח אם מישהו יוכל לתת דוגמא נכונה לשיטה, אקווה ללמוד ממנה הלאה... -
טוב, הסתדרתי כך, לא יודע אם זו הדרך... אבל זה עובד.
app.factory('posts',['$http','$routeParams', function($http){ return{ posts: 0, getPosts: function(){ if(this.posts === 0){ var response = $http({ method: 'post', url: get_posts_object.ajaxurl, params:{ action: 'get_posts', nonce: get_posts_object.nonce }, }).then(function(response){ return response.data; }); this.posts = response; } return this.posts; } } }]);
-
פוסט זה נמחק!
-
@ש-ב-ח בקוד שלך יש בעיות ש@יוסף-בן-שמעון כתב ומשום מה מחק.
הבעיה היא שבפעם הראשונה שתקרא לgetPosts לא תידע מתי התשובה התקבלה וממילא תעשה שימוש בערך לא נכון.
אני ממליץ לך על קוד קצר בהרבה:app.factory('posts', ['$http', function ($http) { var task = $http.post(get_posts_object.ajaxurl, { action: 'get_posts', nonce: get_posts_object.nonce }) .then(function(response){ return response.data; }); return task; }]);
אופן השימוש:
myApp.controller('ctrl', ['posts', function(posts) { posts.then(function(value){ //bla bla }); }]);
נכון, כל שימוש בposts חייב להיות בתוך then זאת למרות שהבקשה תופעל רק פעם אחת בעולם.
אם אתה רוצה להשתמש באובייקט עצמו שחוזר ישירות בHTML וככה אנגולר "מעדכנת" אותו, זה אכן רעיון, והקוד שלך אם ככה בעייתי בגלל שבמקרה כזה אף אחד לא קורא לgetPosts.
הנה הקוד לזה אם התכוונת:app.factory('posts', ['$http', '$routeParams', function ($http) { return { posts: 0, task: $http.post(get_posts_object.ajaxurl, { action: 'get_posts', nonce: get_posts_object.nonce }) .then(function(response){ this.data = response.data; return this.data; }) }; }]); myApp.controller('ctrl', ['posts', function(posts) { this.postsObj = posts; // {{ postsObj.data }} refreshed automaticaly in html //but in code you need know if the task has been finished: //this.postsObj.task.then(...) }]);
-
@dovid אמר באנגולר JS - שירותים (אשמח לביאור העניין):
הבעיה היא שבפעם הראשונה שתקרא לgetPosts לא תידע מתי התשובה התקבלה וממילא תעשה שימוש בערך לא נכון.
אני ממליץ לך על קוד קצר בהרבה:למה?
הרי הgetPosts מחזיר תמיד את הposts, אם הposts שווה ל0 כבתחילת ברייתו תתבצע קריאה לשרת הנתונים ע"מ להביא את אובייקט מהשרת ולהכיל בposts ורק אז יחזיר אותו, מעתה כל קריאה תחזיר את הposts בלי לקרוא לשרת מכיוון שהוא לא שווה ל0.@dovid אמר באנגולר JS - שירותים (אשמח לביאור העניין):
אופן השימוש:
ושוב בכל קונטרולר בו נעשה שימוש בgetPosts הוא יקרא לשרת, ואת זה בדיוק אני מעוניין לחסוך.
@dovid אמר באנגולר JS - שירותים (אשמח לביאור העניין):
למרות שהבקשה תופעל רק פעם אחת בעולם.
לא ברור למה כתבת את זה, כמו שכתבתי קודם: שימוש חוזר בgetPosts בקונטרולר אחר יקרא שוב מהשרת.
@dovid אמר באנגולר JS - שירותים (אשמח לביאור העניין):
הנה הקוד לזה אם התכוונת:
וכאן, מי יקרא לפונקציה שתכיל את הנתונים בposts?
-
@ש-ב-ח אמר באנגולר JS - שירותים (אשמח לביאור העניין):
למה?
הרי הgetPosts מחזיר תמיד את הposts, אם הposts שווה ל0 כבתחילת ברייתו תתבצע קריאה לשרת הנתונים ע"מ להביא את אובייקט מהשרת ולהכיל בposts ורק אז יחזיר אותו, מעתה כל קריאה תחזיר את הposts בלי לקרוא לשרת מכיוון שהוא לא שווה ל0.טעות. וזה הבעיה. אי אפשר לחכות עם return. אם הhttp יקרה, הפונקציה תיגמר תמיד לפני התשובה, וממילא זה יחזיר נתון שגוי.
ושוב בכל קונטרולר בו נעשה שימוש בgetPosts הוא יקרא לשרת, ואת זה בדיוק אני מעוניין לחסוך.
טעות. זה יקרה פעם אחת. צריך בשביל זה להכיר טיפה פרומייס, אם תרצה תוכל לבדוק.
וכאן, מי יקרא לפונקציה שתכיל את הנתונים בposts?
בקוד שלי אין פוקנציה, אלא הtask מכיל פרומייז שרץ מיידית בעת יצירת האובייקט.
-
@dovid אמר באנגולר JS - שירותים (אשמח לביאור העניין):
טעות. וזה הבעיה. אי אפשר לחכות עם return. אם הhttp יקרה, הפונקציה תיגמר תמיד לפני התשובה, וממילא זה יחזיר נתון שגוי.
לא הבינותי למה אמרת את זה...
קרא שוב את הפונקציה שכבתי למעלה... (אני מאמין שזה לא נכון - שהפונקציה נגמרת - כי זה עובד והפונקציה לא חוזרת ריקם, ולא בגלל שאני יודע ).@dovid אמר באנגולר JS - שירותים (אשמח לביאור העניין):
טעות. זה יקרה פעם אחת. צריך בשביל זה להכיר טיפה פרומייס, אם תרצה תוכל לבדוק.
וודאי שזה מה שעשיתי בתחילה, וראיתי קריאה בכל גישה למשתנה (הפקטורי) מכל קונטרולר בנפרד, אנסה שוב...
עדכון: כנראה שמה שניסיתי מתחילה היה שונה (אני גם חושב שאכן השתמשתי בפונקציה בתוך האובייקט (כנראה זה מה שכתב @dovid "בקוד שלי אין פוקנציה, אלא הtask מכיל פרומייז שרץ מיידית בעת יצירת האובייקט".), אז השאלה הבאה לא נשאלת... (אני לא מוחק, אולי יבוא אחר וילמד מהטעות וניסוח השאלה...)תודה.
@dovid אמר באנגולר JS - שירותים (אשמח לביאור העניין):
בקוד שלי אין פוקנציה, אלא הtask מכיל פרומייז שרץ מיידית בעת יצירת האובייקט.
נכון, ואיך קוראים לו לפעול....?