דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. Shared service in angular

Shared service in angular

מתוזמן נעוץ נעול הועבר תכנות
7 פוסטים 4 כותבים 130 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • מנצפךמ מנותק
    מנצפךמ מנותק
    מנצפך
    כתב ב נערך לאחרונה על ידי מנצפך
    #1

    אני מנסה לעשות שירות משותף באנגולר לצורך העברת מידע בין ראוטרים שונים.

    אני יודע שיש כל מיני דרכים להעביר את המידע, אבל אני מנסה להבין למה הקוד הבא לא עובד כראוי:

    יש לי service בשם DataService שמכיל אובייקט בשם product

    import { Injectable } from '@angular/core';
    import { Product } from './product';
    @Injectable({
      providedIn: 'root'
    })
    export class DataService {
      constructor() {
        this.product = {
          name: "Keyboard", id: 1
        }
      }
      public product: Product;
    }
    

    אני ניגש אליו מתוך appComponent

    import { DataService } from './data.service';
    @Component({
      selector: 'app-root',
      templateUrl: './app.component.html',
      styleUrls: ['./app.component.css']
    })
    export class AppComponent {
      product;
      dataService: DataService;
      constructor(dataService: DataService) {
        this.dataService = dataService;
        this.product = this.dataService.product;
        this.dataService.product = {
          name: "Computer", id: 1
        }
      }
    }
    

    ואני מציג אותו ע"י ה app.component.html

    {{product | json}}
    

    ציפיתי שאחרי שאשנה את המופע של ה dataService.product ל "Computer" בשורה 14, גם ה this.product ישתנה.
    כי הרי חיברנו אותם בשורה 11?
    למעשה זה לא קורה.
    מה ההסבר לזה?

    yossizY י 2 תגובות תגובה אחרונה
    0
    • yossizY מנותק
      yossizY מנותק
      yossiz
      השיב למנצפך ב נערך לאחרונה על ידי
      #2

      @מנצפך אמר בShared service in angular:

      ציפיתי שאחרי שאשנה את המופע של ה dataService.product ל "Computer" בשורה 14, גם ה this.product ישתנה.

      לא
      אם היית עושה:

      this.dataService.product.name = "Computer";
      

      אז זה היה עובד.
      אבל יצרת אובייקט חדש. אז dataService.product מצביע על החדש אבל this.product עדיין מצביע על הישן.

      📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

      תגובה 1 תגובה אחרונה
      4
      • מנצפךמ מנותק
        מנצפךמ מנותק
        מנצפך
        כתב ב נערך לאחרונה על ידי
        #3

        ואוו. מעניין.
        חדש לי.
        ככה זה גם ב C#?

        dovidD yossizY 2 תגובות תגובה אחרונה
        0
        • dovidD מנותק
          dovidD מנותק
          dovid ניהול
          השיב למנצפך ב נערך לאחרונה על ידי
          #4

          @מנצפך כן.

          מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

          בכל נושא אפשר ליצור קשר dovid@tchumim.com

          תגובה 1 תגובה אחרונה
          4
          • yossizY מנותק
            yossizY מנותק
            yossiz
            השיב למנצפך ב נערך לאחרונה על ידי yossiz
            #5

            @מנצפך כן, ברור. (אני לא מומחה ב-#C, אבל להבנתי זה כך).
            אגב, אם אתה כותב ב-#C אז אתה חייב להכיר את ההבדל בין reference type ל-value type. אז גם ב-JS, אובייקט מתנהג כמו reference type, ו-primitive מתנהג כמו value type. אבל המצביע של האובייקט עובד כמו value type. לכן כאשר אתה כותב:

            this.product = this.dataService.product;
            

            אתה מעתיק את המצביע.
            לכן כאשר אתה משנה את הערך של dataService.product זה לא משפיע על הערך של this.product.

            (מקווה שכוונתי פחות או יותר ברור...)

            📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

            dovidD תגובה 1 תגובה אחרונה
            4
            • dovidD מנותק
              dovidD מנותק
              dovid ניהול
              השיב לyossiz ב נערך לאחרונה על ידי
              #6

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

              מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

              בכל נושא אפשר ליצור קשר dovid@tchumim.com

              תגובה 1 תגובה אחרונה
              7
              • י מנותק
                י מנותק
                יוסף בן שמעון
                השיב למנצפך ב נערך לאחרונה על ידי
                #7

                @מנצפך אמר בShared service in angular:

                הערה צדדית, חלק מזה מיותר:

                export class AppComponent {
                  product;
                  dataService: DataService; // מיותר
                  constructor(dataService: DataService) {
                    this.dataService = dataService; // מיותר
                    this.product = this.dataService.product;
                    this.dataService.product = {
                      name: "Computer", id: 1
                    }
                  }
                }
                

                TS עושה את זה לבד, רק תגדיר אם זה פרטי או ציבורי
                https://www.typescriptlang.org/play?#code/MYGwhgzhAECCAO8DCB7AtvFA7AplgLgN4CwAUNBdMNhPgE4Cuw+KdAFPAwEYgCWw0ACZh8YAMo46AN344AXNDBYAngEpCAXzIagA

                תגובה 1 תגובה אחרונה
                2

                בא תתחבר לדף היומי!
                • התחברות

                • אין לך חשבון עדיין? הרשמה

                • התחברו או הירשמו כדי לחפש.
                • פוסט ראשון
                  פוסט אחרון
                0
                • דף הבית
                • קטגוריות
                • פוסטים אחרונים
                • משתמשים
                • חיפוש
                • חוקי הפורום