@odeddvir כי לא לכל דבר מתאימה טבלה.
בכ"א הפתרון הוא לשנות את
android:layout_height="match_parent"
ל-
android:layout_height="wrap_content"
@odeddvir כי לא לכל דבר מתאימה טבלה.
בכ"א הפתרון הוא לשנות את
android:layout_height="match_parent"
ל-
android:layout_height="wrap_content"
צהרים טובים!
שאלה של מתחיל בפיתוח לאנדרואיד:
אני מנסה למקם LinearLayout בעל orientation של vertical, כאשר בתוכו יש כמה LinearLayout כאשר הם בעלי orientation של horizontal, בכדי להגיע לתצוגה טבלאית.
בפועל באפליקציה מוצג לי רק ה-LinearLayout העליון
מדוע זה קורה?
תודה רבה - מצו"ב קוד לדוגמא
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical"><--------------------------
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="horizontal"><--------------------------
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="horizontal"><--------------------------
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="horizontal"><--------------------------
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
</LinearLayout>
</LinearLayout>
@רפאל
גלול מעלה בשרשור ותמצא את התשובה. אם אתה משלם מס קבלת מחמאות, ראה את דברי כמבוטלים.
@רפאל תודה רבה איש מקצוען.
@רפאל אמר בgetTime אינו פונקציה:
@yyy על מנת להוכיח שאני טועה (כתמיד) נסה להוסיף את השורה הבאה לקוד, ווודא שהתוצאה שלילית.
console.log(typeof this.DB[0].BirthDate === 'string')
זה מחזיר true.
אני מבין שהשגיאה היא בשורה
var ageDifMs = Date.now() - BirthDate.getTime();
בכדי לנסות לפתור את הבעיה
עשיתי את הדבר הבא
var ageDifMs = Date.now() - JSON.parse(BirthDate).getTime();
בקיצור להפוך את זה לאובייקט.
הבעיה שכאן כבר יש שגיאה שהטייפ לא מתאים:
Argument of type 'Date' is not assignable to parameter of type 'string'
כי הצהרתי שזה Date, ועכשיו אני מתייחס לזה כ-string.
בקיצור בלגן.
איך מתקדמים?
@רפאל
איפה ראית String?
חיפשתי ברשת פונקציה לחישוב גיל, הנובע מתאריך לידה בפורמט Date, וזה מה שמצאתי.
setAge(BirthDate:Date) {
var ageDifMs = Date.now() - BirthDate.getTime();
var ageDate = new Date(ageDifMs); // miliseconds from epoch
return Math.abs(ageDate.getUTCFullYear() - 1970);
}
בדקתי ואכן הפונקציה מחזירה Number של הגיל.
אני צריך לעדכן מידי פעם גילאים שהשתנו ולשם כך אני קורא לפונקציה הבאה:
updateAllAges(){
for (let i = 0; i < this.DB.length; i++) {
this.DB[i].Age =DBtype.setAge(this.DB[i].BirthDate);
}
}
כאשר setAge היא פונקציה שהובאה למעלה, אלא שהפכתי אותה לסטטית ומשויכת למחלקה DBtype.
הוספתי לכפתור את ה-Click הבא:
<button (click)="updateAllAges() type="button">Click Me!</button>
ברמת הקומפילציה הכל עובד חלק (אנגולר), אבל כאשר אני משנה את התאריך ולוחץ על הכפתור אני מקבל בקונסול של הדפדפן את השגיאה הבאה:
core.js:6456 ERROR TypeError: BirthDate.getTime is not a function
at Function.setAge (myFile.ts:3)
שאלתי היא למה getTime אינו פונקציה, וכיצד ניתן לפתור זאת?
תודה רבה לחברי האתר הנהדרים.
יש לי מחלקה CLS הכתובה ב-TS שיש בה משתנה תאריך, מסוג Date.
אני רוצה להציג אותו ב-HTML אבל בד בבד לפתוח אותו לעריכה כך:
<input type="date" [(ngModel)]="CLS.BirthDate">
הפלט המוצג אינו התאריך אלא רק המבנה שלו:
dd/mm/yyyy
(כאשר יש אופציה לשנות את התאריך ואז הוא יהיה מוצג.)
אומנם ב-html שמרונדר ע"י אנגולר התאריך קיים, אלא שהוא לא מוצג כשורה.
<input _ngcontent-spd-c50="" type="date" ng-reflect-model="**Tue Dec 17** 1991 00:00:00 GMT+0" class="ng-pristine ng-valid ng-touched">
כיצד ניתן להציג את התאריך בצורה נורמלית?
תודה רבה.
@yossiz אמר בoverride תעלומה:
הפעולה של downCasting בודקת את הטייפ האמיתי דהיינו ה-runtime type וזורקת שגיאה אם זה לא מתאים.
בודקת ביחס למה? ביחס ל-Cast, או ביחס ל-declared?
@yossiz אמר בoverride תעלומה:
@yyy לא הבנתי את דבריך. איפה אתה רואה שהמוריש נחשב לטייפ האמיתי? זה לא קשור ליורש או למוריש, הטייפ האמיתי קשור לאיזה בנאי השתמשת כשבנית את האובייקט.
הבנתי.
עכשיו איך תסביר מבחינה תיאורטית את המקרה הבא:
יש B שיורש מ-A, ונבנה אובייקט מסוג A, המוצבע ע"י מצביע מסוג A, אלא שיש לו downCasting ל-B, באופן הבא:
((B)a).fooA();
התוצאה תהיה Exception בזמן ריצה.
פה חייבים לכאורה להגיע לסוגיית הקצאת הזיכרון, כלומר המערכת מנסה לגשת לזיכרון מסוג B, בשעה שההקצאה היא רק בגודל A. יש לך הסבר יותר אלגנטי?
@yossiz
תודה על ההסבר המושקע.
אני מבין שכאשר אתה בונה אובייקט מסוג B ומצביע עליו עם משתנה מסוג A, האובייקט ה"אמיתי" הוא B בגלל שהוא מבנה הנתונים שהוקצה (וסליחה על הגלישה שוב לכיוון אסמבלי).
מה שלא ברור זה למה המוריש נחשב לטייפ האמיתי, יותר מהטייפ היורש?
נתונות המחלקות הבאות:
class A
{
public virtual void vfoo()
{
Console.WriteLine("vfoo from A");
}
public void foo()
{
Console.WriteLine("foo of A");
}
}
class B : A
{
public override void vfoo()
{
Console.WriteLine("vfoo from B");
}
public void foo()
{
Console.WriteLine("foo of B");
}
public void baseVfoo()
{
base.vfoo();
}
public void baseFoo()
{
base.foo();
}
}
להלן הקוד ב-Main ובצידו הפלט
A a1 = new A();
a1.vfoo(); //vfoo from A
a1.foo();//foo from A
B b1 = new B();
b1.vfoo();//vfoo from B
b1.foo();//vfoo from B
b1.baseVfoo();//vfoo from A
b1.baseFoo();//foo from A;
A ab = new B();
ab.foo(); //foo from A
ab.vfoo(); //foo from B
כעת לתעלומה:
כשאני מייצר B עם זיכרון של B (שורה 4) ופונה לפונקציה מסוג virtual ב-base שלו (שורה 7), אני מקבל את הפונקציה של המחלקה המורישה, כלומר פונקציה של A.
מסקנה: כאשר כותבים פונקציית override ביורש, היא לא דורסת את הזיכרון של המוריש.
מאידך כאשר אני מייצר A עם זיכרון של B (שורה 9), ופונה לפונקציה הוירטואלית (שורה 11) שלהבנתי היא ב-base (כלומר בחלק הזיכרון של ה-A, כי אין בכלל גישה כעת ל-B) אני מקבל להפתעתי את הפונקציה של B.
מסקנה: כאשר מתבצעת אפילו רק הקצאת זיכרון של B, הפונקציה הוירטואלית ב-A נדרסת.
איך מבינים את הסתירה הזו?
@יוסף-בן-שמעון
עכשיו הבנתי מה רצית
הכתובת צריכה להיות כך:
assets/xxx.jpg
זה באמת עובד ותודה למסייעים
@yossiz אמר בהקלדת URL מאפסת LocalSession?:
@yyy אם הדף נטען מחדש אז הקוד הזה רץ שוב:
sessionStorage.setItem("Allowed","0")
(אגב, זה לגמרי לא תקין לעשות בקרת גישה בצד הלקוח, אבל זה לא הנושא פה)
המקום היחיד שמופיעה פקודת איפוס שכזו, היא בקונסטרקטור של הסרויס, אבל ממה שהבנתי סרויסים באנגולר הם סינגלטונייים, כלומר נטענים פעם אחת וזהו, ולכן מה הסיבה שהקונסטרקטור רץ שוב?
(אני אומנם טוען את Svc בקונסטרקטור של כל קומפוננטה, בכדי לאפשר לקומפוננטה גישה לרכיבים של האבטחה, אבל זה לא סיבה להריץ שוב את הקונסטרקטור, ובאמת אם אני לא ניגש דרך ה-URL אלא באמצעות RouterLinks לקומפוננטה, הערך לא מתאפס, כלומר הקונסטרקטור של Svc לא רץ פעם נוספת)
@yossiz
הבעיה שזה כן מאפס לי.
אנסה לתאר מה אני מנסה לעשות:
יש סרויס Svc שתפקידו לוודא שמשתמש לא מורשה, לא מקליד כתובת של דף וכך עוקף את מנגנון ההגנה של סיסמה+שם.
Svc מריץ מקונסטרקטור את הפקודה
sessionStorage.setItem("Allowed","0").
בקומפוננטה הראשונה שנטענת המשתמש מקבל מסך Login
שמפעיל את הפונקציה הזו, הנמצאת ב-Svc:
checkPassword() {
if ((this.password === "xxxx"&&this.name ==="yosi"))
{
sessionStorage.setItem("Allowed","1")
this.router.navigate(['allitems']);
} else alert('wrong password');
}
בשלב הבא בכל קומפוננטה שנטענת, בקונסטרקטור שלה נבדק ה-localSession, ע"י הפונקציה הבאה (גם היא ב-Svc):
redirectIfUnallowed(){
if(sessionStorage.getItem("Allowed") != "1")
this.router.navigate(['landing']);
}
הבעיה שהערך של Allowed ב-SessionStorage שומר על יציבות כל עוד אני לא ניגש ל-URL. אם אני כותב ב-URL נניח http://localhost:4200/favorites (כתובת אמיתית) הערך של Allowed מתאפס ואני נזרק אל מסך landing, למרות שהזדהתי כשורה.
מדובר על פרוייקט אנגולרי ובו כתובת המטופלת ע"י
app-routing.module.ts (ללא פרמטרים).
תודה
זה לא עוזר. הפלא הוא שיש קבצים שהוא כן מסכים להעלות לי.
אני על localHost אם זה משנה.
אני מנסה לטעון תמונה לאלמנט img באופן הבא
<img src="C:\Users\xxx\Desktop\Angular\projName\src\assets\myImg.jpg ">
ואני מקבל שגיאה בדפדפן:
Not allowed to load local resource:
אם אני מכנסי נתיב יחסי כזה:
projName\src\assets\myImg.jpg
השגיאה משתנה ל:
myImg.jpg:1 GET http://localhost:4200/projName/src/assets/myImg.jpg 404 (Not Found)
לפי מה שהבנתי המיקום assets הוא המיקום התקני ל"נכסים" כמו תמונות, מה לא נכון במה שאני עושה?
תודה לחברי האתר הנפלאים
נניח יש לי DIV שאני רוצה שבתחתיתו יהיה תמיד כפתור, ללא תלות בגודל שאר התוכן שמעליו. (אני מייצר 100 דיבים כאלו כשלכל אחד יש תוכן משתנה)
שימוש ב-padding/marging לא טוב לי כי הוא קבוע.
איך אפשר לומר לאלמנט תיצמד למטה בכל מקרה?