Angular-google-maps: ์ง€๋„์˜ ๋†’์ด๋ฅผ ํ™”๋ฉด ํฌ๊ธฐ์— ๋งž์ถ”๋Š” ๋ฐฉ๋ฒ•

์— ๋งŒ๋“  2018๋…„ 02์›” 04์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: SebastianM/angular-google-maps

์ง€๋„์˜ ๋†’์ด๋ฅผ ํ™”๋ฉด ํฌ๊ธฐ์— ๋งž์ถ”๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. height:100% ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ํ•˜๋Š”์ง€ ์•Œ๋ ค์ฃผ์‹ค ์ˆ˜ ์žˆ๋‚˜์š”?
๊ฐ์‚ฌ ํ•ด์š”!

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‘ ๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ ์š”์†Œ์— AGM ํƒœ๊ทธ๋ฅผ ๋ž˜ํ•‘ํ•ฉ๋‹ˆ๋‹ค.

<div class="outer-wrapper">
  <div class="map-wrapper" id="wrapper" #wrapper>
    <agm-map
      [latitude]="latitude"
      [longitude]="longitude"
      [scrollwheel]="true"
      [zoom]="zoom"
      (idle)="idle()"
      (centerChange)="centerChange($event)"
      id="AgmMap"
      #AgmMap>
      <agm-marker 
         [latitude]="latitude"
         [longitude]="longitude"
         [markerClickable]="true"></agm-marker>
    </agm-map>
  </div>
</div>

๊ทธ๋Ÿฐ ๋‹ค์Œ ์™ธ๋ถ€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ 100%๋กœ ์„ค์ •ํ•˜๊ณ  ๋‚ด๋ถ€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ž„์˜์˜ ๋†’์ด๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค(์ค‘์š”ํ•˜์ง€ ์•Š์Œ).
AGM ์š”์†Œ๋ฅผ ์ด์™€ ๊ฐ™์ด CSS๋ฅผ ํ†ตํ•ด 100%๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

.outer-wrapper {
  height: 100%;
  width: 100%;
  padding: 0;
  margin: 0;

  .map-wrapper {
    height: 400px;

    agm-map {
      height: 100%;
      width: 100%;
      margin: 0;
      padding: 0;
    }
  }
}

๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ๋‹ค์Œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ ํœด, centerChange ๋ฐ ํฌ๊ธฐ ์กฐ์ • ์ด๋ฒคํŠธ๋ฅผ ์บก์ฒ˜ํ•ฉ๋‹ˆ๋‹ค.

@HostListener('window:resize')
  onWindowResize() {
    this.onResize();
  }

  ngAfterViewInit() {
    this.renderer.setElementStyle(
      this.wrapper.nativeElement, 'height',
      (window.innerHeight) + 'px'
    );
  }

  onResize() {
    // resize the container for the google map
    this.renderer.setElementStyle(
      this.wrapper.nativeElement, 'height',
      (window.innerHeight ) + 'px'
    );

    // recenters the map to the resized area.
    this.agmMap.triggerResize().then(() =>  
       this.agmMap._mapsWrapper.setCenter({lat: this.centerLat, lng: this.centerLng}));
  }

  // idle fires after paning or zooming is done. 
  // This is where we want to capture the center of the map.
  // This way if the user resizes, the center is preserved.
  idle() {
    this.centerLat = this.changeLat;
    this.centerLng = this.changeLng;
  }

// this event fires whenever any event changes the center. Panning, zooming, or resizing.
  centerChange(event: any) {
    if (event) {
      this.changeLat = event.lat;
      this.changeLng = event.lng;
    }
  }

๋˜ํ•œ ๋‹ค์Œ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜์‹ญ์‹œ์˜ค.

@ViewChild('AgmMap') agmMap: any;
  @ViewChild('wrapper') wrapper: ElementRef;

public latitude: number;
  public longitude: number;
  private centerLat: number;
  private centerLng: number;
  public zoom: number;

  private changeLat: number;
  private changeLng: number;

@angular/core ๋ฐ HostListener์˜ ๋ Œ๋”๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

๋ชจ๋“  3 ๋Œ“๊ธ€

๋‘ ๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ ์š”์†Œ์— AGM ํƒœ๊ทธ๋ฅผ ๋ž˜ํ•‘ํ•ฉ๋‹ˆ๋‹ค.

<div class="outer-wrapper">
  <div class="map-wrapper" id="wrapper" #wrapper>
    <agm-map
      [latitude]="latitude"
      [longitude]="longitude"
      [scrollwheel]="true"
      [zoom]="zoom"
      (idle)="idle()"
      (centerChange)="centerChange($event)"
      id="AgmMap"
      #AgmMap>
      <agm-marker 
         [latitude]="latitude"
         [longitude]="longitude"
         [markerClickable]="true"></agm-marker>
    </agm-map>
  </div>
</div>

๊ทธ๋Ÿฐ ๋‹ค์Œ ์™ธ๋ถ€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ 100%๋กœ ์„ค์ •ํ•˜๊ณ  ๋‚ด๋ถ€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ž„์˜์˜ ๋†’์ด๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค(์ค‘์š”ํ•˜์ง€ ์•Š์Œ).
AGM ์š”์†Œ๋ฅผ ์ด์™€ ๊ฐ™์ด CSS๋ฅผ ํ†ตํ•ด 100%๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

.outer-wrapper {
  height: 100%;
  width: 100%;
  padding: 0;
  margin: 0;

  .map-wrapper {
    height: 400px;

    agm-map {
      height: 100%;
      width: 100%;
      margin: 0;
      padding: 0;
    }
  }
}

๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ๋‹ค์Œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ ํœด, centerChange ๋ฐ ํฌ๊ธฐ ์กฐ์ • ์ด๋ฒคํŠธ๋ฅผ ์บก์ฒ˜ํ•ฉ๋‹ˆ๋‹ค.

@HostListener('window:resize')
  onWindowResize() {
    this.onResize();
  }

  ngAfterViewInit() {
    this.renderer.setElementStyle(
      this.wrapper.nativeElement, 'height',
      (window.innerHeight) + 'px'
    );
  }

  onResize() {
    // resize the container for the google map
    this.renderer.setElementStyle(
      this.wrapper.nativeElement, 'height',
      (window.innerHeight ) + 'px'
    );

    // recenters the map to the resized area.
    this.agmMap.triggerResize().then(() =>  
       this.agmMap._mapsWrapper.setCenter({lat: this.centerLat, lng: this.centerLng}));
  }

  // idle fires after paning or zooming is done. 
  // This is where we want to capture the center of the map.
  // This way if the user resizes, the center is preserved.
  idle() {
    this.centerLat = this.changeLat;
    this.centerLng = this.changeLng;
  }

// this event fires whenever any event changes the center. Panning, zooming, or resizing.
  centerChange(event: any) {
    if (event) {
      this.changeLat = event.lat;
      this.changeLng = event.lng;
    }
  }

๋˜ํ•œ ๋‹ค์Œ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜์‹ญ์‹œ์˜ค.

@ViewChild('AgmMap') agmMap: any;
  @ViewChild('wrapper') wrapper: ElementRef;

public latitude: number;
  public longitude: number;
  private centerLat: number;
  private centerLng: number;
  public zoom: number;

  private changeLat: number;
  private changeLng: number;

@angular/core ๋ฐ HostListener์˜ ๋ Œ๋”๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

์•ˆ๋…•ํ•˜์„ธ์š”,

์•ˆ๋…•ํ•˜์„ธ์š”.

ํฌ๊ธฐ ์กฐ์ •, ๋น ๋ฅธ ์งˆ๋ฌธ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ ๋กœ๋“œํ•  ๋•Œ ์ด๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ์„ค์ •ํ•ฉ๋‹ˆ๊นŒ? ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ํŽ˜์ด์ง€๋ฅผ ๋กœ๋“œํ•  ๋•Œ ํ˜„์žฌ ํ™”๋ฉด์— ๋งž๊ฒŒ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๊ฐ์‚ฌ ํ•ด์š”.

๋ฌธ์•ˆ ์ธ์‚ฌ.
์ œ์ด์ œ์ด

์‹ ๊ฒฝ ์“ฐ์ง€ ๋งˆ์š” :)

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰