Single Page App: מערכת ניתוב
-
למה אתה לא מחבב את הספר?
האופי שלו מבולבל, כל נושא מקבל נגיעה ונעזב לטובת האחר. הפרקים התקועים של הtesting הם לדעתי תוצאה קלאסית של "ספר לאליטות" ששם אוי ואבוי ללמוד משהו שאי אפשר לבחון אותו בtdd. אין שום סיבה למה לא לשמור את כל הקטע של הטסטינג לאחרי שתכיר את אנגולר, ואפשר לכתוב במהלך הפרקים שאפשר לעיין שם כדי לבדוק את האמור פה.
אבל הכי עצבן אותי זה הדוגמה בעמוד 70 שמייצגת מאוד. למה צריך סרויס? כי... בא תלמד מאה מושגים חדשים (swithc, sub-controller). ותשתמש איתם בדיוק כמו שאנו רוצים (את הבעיה ניתן לפתור בשתי שניות עם קונטרולר, אבל בדרך שיש בדוגמה יש בעיה ולכן..) ואז תבין (?) למה צריך, וברגע שתבין נעבור לפרק הבא במקום להסביר בדיוק מה זה סרויס או להרחיב על הסרויסים הקיימים באנגולר.פורסם במקור בפורום CODE613 ב08/03/2016 12:51 (+02:00)
-
@דוד ל.ט.
ב. הדפדפן אמור שלא להריץ סקריפט שהוכנס בhtml מסיבות אבטחה, כך אני קורא פה: https://developer.mozilla.org/en-US/doc ... /innerHTML שונה ממה שנראה פה http://stackoverflow.com/questions/6109 ... 96#3603496
ג. זה כנראה לא הגיוני להביא תצוגה עם סקריפט. זה תוצאה מהארכיטקטורה הקודמת?.ראיתי פה בתשובה הראשונה הוא אומר שאם אתה מגדיר בdataType HTML זה אמור לעבוד.. אבל זה עדיין לא עבד לי.
אמנם בתשובה השניה שם (באותו קישור) הוא כותב שאם משתמשים ב innerHTML זה אכן לא עובד, אז שיניתי והשתמשתי בפונקציה של JQuery - append וזה אכן עובד מצויין!
הנה הקוד המעודכן:self.before_show = function (_url) { $.ajax({ url: _url, dataType:'html', success: function (data) { $(container).append(data); self.after_show(); }, error: function (data) { $(container).append(data); } }); };
אכן, זה תוצאה של הארכיטקטורה הקודמת, שכל התצוגות כבר ממומשות בrazor ואני רק צריך להוסיף את מערכת הניתוב..
במקביל אני מנסה לכתוב את כל הפרוייקט מחדש באנגולר, ומנגד שהשרת יחזיר רק JSON אבל עוד ארוכה הדרך לפנינו :lol:למה אתה לא מחבב את הספר?
פורסם במקור בפורום CODE613 ב08/03/2016 12:39 (+02:00)
-
כמה הערות:
א. אנגולר טוען את הדף רק פעם אחת, אח"כ זה בקאש.
ב. הדפדפן אמור שלא להריץ סקריפט שהוכנס בhtml מסיבות אבטחה, כך אני קורא פה: https://developer.mozilla.org/en-US/docs/Web/API/Element/innerHTML שונה ממה שנראה פה http://stackoverflow.com/questions/610995/cant-append-script-element/3603496#3603496
ג. זה כנראה לא הגיוני להביא תצוגה עם סקריפט. זה תוצאה מהארכיטקטורה הקודמת?.פורסם במקור בפורום CODE613 ב08/03/2016 12:17 (+02:00)
-
כמה עדכונים:
א. התחלתי ללמוד אנגולר קצת יותר רציני ואני בעמוד 55 :lol: !! (דילגתי על הפרק של הUnit test כמו שmat המליץ).
ב. ניסיתי להוסיף לפרוייקט רק את הניתוב של אנגולר, וזה עובד מעולה בטעינה הראשונית של הדף. העניין הוא שהוא טוען רק את הHTML ולא את כל הסקריפטים שמאחוריו, כך שזה לא בדיוק עוזר לי.
ג. ניסיתי לממש מערכת ניתוב בעצמי, הנה הקוד:window.app = { Pages: {}, pages: {} }; //בנאי של עמוד window.app.Pages.Page = function (container, url) { var self = this; self.el = document.createElement('div'); self.url = 'https://localhost:44300' +url; //כמובן שזהו שרת מקומי וצריך לשנותו כל חד לפום דרגא דיליה.. self.before_show = function (_url) { var result; $.ajax({ url:_url, success: function (data) { result = data; self.el.innerHTML = result; container.appendChild(self.el); self.after_show(); }, error: function (data) { result = data; self.el.innerHTML = result; container.appendChild(self.el); } }); }; //אופציה להוסיף קוד שיפעל לאחר טעינת העמוד self.after_show = function () { }; self.show = function () { container.innerHTML = ''; self.before_show(url); }; }; //קריאה לעמוד הנכון ע"פ שינוי הHash (#) function hash_changed() { var new_hash = window.location.hash; var page_name = new_hash.substr(1); var pages = window.app.pages; if (pages[page_name]) { pages[page_name].show(); } else { console.log('Page not found: ' + page_name); } } window.addEventListener('hashchange', hash_changed);
וזה המימוש:
var container = document.querySelector('#pageBody'); var Pages = window.app.Pages; var pages = window.app.pages; pages.page1 = new Pages.Page(container, '/DonorsVM/_Index'); pages.page2 = new Pages.Page(container, '/Donation/DonationManagment'); pages.page3 = new Pages.Page(container,'/ManageOrganization/Index');
הבסיס של הקוד בנוי על קוד של ינון פרק ממדריך שלו באתר - ToCode, ואני שיניתי אותו שהוא לא יטען תבנית של HTML אלא יטען קוד מהשרת ע"י AJAX ויציג אותו למשתמש.
הבעיה שלי היא שגם כאן אני חוזר לאותה בעיה שהייתה לי בשימוש עם UI-Router של אנגולר, שזה לא טוען לי את הסקריפטים. כלומר, התשובה שמתקבלת מהשרת אכן מכילה את תגיות הscript אולם משום מה הדפדפן לא טוען אותם..
כשהשתמשתי באנגולר חשבתי שזה בגלל שצריך להגדיר לו בקונטרולר בדיוק מה לעשות - אחרת הוא לא מתייחס לזה.
אולם, זה קורה לי גם כשאני מממש בעצמי, ואין לי מושג למה זה קורה? הרי כשאני טוען את אותו דף עם אותם תגיות ע"י בקשת AJAX פשוטה, הוא כן טוען את הסקריפטים - אז מה השתנה?
תודה רבה לעוזרים..פורסם במקור בפורום CODE613 ב08/03/2016 11:25 (+02:00)
-
תודה רבה mat ודוד ל.ט.!
@דוד ל.ט.
(אתה יכול להכניס את הJSON ישר בתוך מנוע הView של הRazor).
לא הבנתי מה הכוונה??
@דוד ל.ט.אני חושב שאכן אתה יכול להמשיך הכל כרגיל ולהתמש רק בניווט של אנגולר וכן ראיתי פה: http://stackoverflow.com/a/27182836/1271037
אבל אני רק בעמוד 70 אז אני לא מתערב.מעולה!! זה בדיוק מה שאני מחפש, נראה איך זה ילך.
וכמובן, ברור שזה רק פתרון זמני, כי עקרונית הכי טוב שהכל יהיה ע"י JSON..פורסם במקור בפורום CODE613 ב03/03/2016 18:20 (+02:00)
-
לא הייתי פה שבוע.. ואני רואה שזה הפך לדיון על אנגולר :lol:
דווקא אני מאד התלהבתי מאנגולר, ואפי' השגתי ספר שמלמד אותו (angularJs - up and running באנגלית כמובן..)!! אני אוחז בעמוד 70
אך עדיין לא הצלחתי להבין האם כשארצה להשתמש באנגולר, אצטרך שצד השרת יספק רק את הנתונים בצורה של json וכדו' ובקליינט אני אכתוב תבניות HTML שהתוכן יוזרק לתוכם ע"י הבינדינג של אנגולר, וממילא אני צריך לשנות את כל צד השרת שלי להחזיר JSON, ולבנות בנוסף קליינט אנגולרי?
או שמא ישנה אפשרות גם באנגולר לקבל מהשרת HTML מוכן ע"י AJAX, ולשתול אותו במקום הנכון, כך שלא אצטרך (כרגע.. כי עקרונית ברור לי שהכי נכון לעשות שהשרת יחזיר JSON וכל העבודה תתבצע בצד הלקוח - מבחינת חיסכון במשאבים בשרת, וכן ייתרון של מהירות כיון שזה חוסך בתעבורה ברשת) לשנות את צד השרת שבנוי כבר ע"י razor וכל מה שאני צריך זה להוסיף לו את מערכת הניווט??(אתה יכול להכניס את הJSON ישר בתוך מנוע הView של הRazor).
אני חושב שאכן אתה יכול להמשיך הכל כרגיל ולהתמש רק בניווט של אנגולר וכן ראיתי פה: http://stackoverflow.com/a/27182836/1271037
אבל אני רק בעמוד 70 אז אני לא מתערב.mat היקר, אשמח אם יש לך תשובה בשבילי..
(כמובן גם לכל אחד אחר :lol: רק נראה לי של mat יש את הניסיון עם אנגולר..)
תודה רבה רבה מראש!!mat זה לא רק בגלל נסיון באנגולר. זה בגלל שזה mat.
פורסם במקור בפורום CODE613 ב03/03/2016 18:04 (+02:00)
-
לא הייתי פה שבוע.. ואני רואה שזה הפך לדיון על אנגולר :lol:
דווקא אני מאד התלהבתי מאנגולר, ואפי' השגתי ספר שמלמד אותו (angularJs - up and running באנגלית כמובן..)אך עדיין לא הצלחתי להבין האם כשארצה להשתמש באנגולר, אצטרך שצד השרת יספק רק את הנתונים בצורה של json וכדו' ובקליינט אני אכתוב תבניות HTML שהתוכן יוזרק לתוכם ע"י הבינדינג של אנגולר, וממילא אני צריך לשנות את כל צד השרת שלי להחזיר JSON, ולבנות בנוסף קליינט אנגולרי?
או שמא ישנה אפשרות גם באנגולר לקבל מהשרת HTML מוכן ע"י AJAX, ולשתול אותו במקום הנכון, כך שלא אצטרך (כרגע.. כי עקרונית ברור לי שהכי נכון לעשות שהשרת יחזיר JSON וכל העבודה תתבצע בצד הלקוח - מבחינת חיסכון במשאבים בשרת, וכן ייתרון של מהירות כיון שזה חוסך בתעבורה ברשת) לשנות את צד השרת שבנוי כבר ע"י razor וכל מה שאני צריך זה להוסיף לו את מערכת הניווט??mat היקר, אשמח אם יש לך תשובה בשבילי..
(כמובן גם לכל אחד אחר :lol: רק נראה לי של mat יש את הניסיון עם אנגולר..)
תודה רבה רבה מראש!!פורסם במקור בפורום CODE613 ב03/03/2016 17:34 (+02:00)