Событие щелчка на карте привязки свойств с выпадающим списком выбора в ngx-leaflet / Angular 2 - PullRequest
0 голосов
/ 05 июня 2018

У меня есть карта с региональными полигонами.Под картой у меня есть выпадающий список ввода, который динамически считывает имена полигонов в качестве параметров.Когда пользователь щелкает региональные полигоны на карте, я хочу, чтобы в раскрывающемся списке выбранные входные данные обновлялись с выбранным именем полигона (которое существует как поле 'name' в файле geojson).

Я полагаю, что способ добиться этого - использовать привязку свойств в файле шаблона HTML.Поэтому в моем классе выбора я установил свойство value как значение clicked, например, так:

<select class="form-control" id="selectRegion" [value]="clicked">

clicked изначально определяется как пустая строка в компоненте приложения.Когда щелкают многоугольник, я устанавливаю clicked в качестве поля имени многоугольника внутри события нажатия onEachFeature.Журнал консоли показывает, что переменная clicked обновляется правильно.Однако выбранный вход НЕ обновляется с событиями щелчка, как ожидалось.

Я подозреваю, что проблема в том, что this не обновляется должным образом внутри моих функций?Как получить выбранный вход для обновления с помощью событий щелчка на карте?

Вот некоторый код (на основе ngx-leaflet-tutorial-ngcli из Asymmetrik):

Geojson (сохранен как polygons.geojson в папке ресурсов:

{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "properties": {
        "stroke": "#555555",
        "stroke-width": 2,
        "stroke-opacity": 1,
        "fill": "#555555",
        "fill-opacity": 0.5,
        "name": "poly1"
      },
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [
              -121.95098876953125,
              46.82966386051541
            ],
            [
              -121.78482055664061,
              46.82966386051541
            ],
            [
              -121.78482055664061,
              46.91368905872705
            ],
            [
              -121.95098876953125,
              46.91368905872705
            ],
            [
              -121.95098876953125,
              46.82966386051541
            ]
          ]
        ]
      }
    },
    {
      "type": "Feature",
      "properties": {
        "stroke": "#555555",
        "stroke-width": 2,
        "stroke-opacity": 1,
        "fill": "#555555",
        "fill-opacity": 0.5,
        "name": "poly2"
      },
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [
              -121.77726745605469,
              46.83107318799318
            ],
            [
              -121.62963867187499,
              46.83107318799318
            ],
            [
              -121.62963867187499,
              46.913220009605624
            ],
            [
              -121.77726745605469,
              46.913220009605624
            ],
            [
              -121.77726745605469,
              46.83107318799318
            ]
          ]
        ]
      }
    }
  ]
}

App.module.ts:

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { LeafletModule } from '@asymmetrik/ngx-leaflet';
import { HttpClientModule } from '@angular/common/http';


import { AppComponent } from './app.component';

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    LeafletModule.forRoot(),
    HttpClientModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

App.component.html:

<div class="map"
  leaflet
  [leafletLayers]="layers"
     [leafletFitBounds]="fitBounds"></div>
<div class="form-group">
  <select class="form-control" id="selectRegion" [value] = "clicked">
    <option *ngFor="let region of regions">{{ region }}</option>
  </select>
</div>

App.component.ts:

import { Component, OnInit } from '@angular/core';
import { HttpClient } from '@angular/common/http';

import * as L from 'leaflet';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {

  layers: L.Layer[];
  fitBounds = [[46.67, -122.25], [47.01, -121.302]];
  regions = [];
  clicked = '';

  constructor(private http: HttpClient) { }

  ngOnInit() {

    // read in geojson of poly
    this.http.get<any>('/assets/polygons.geojson')
      .subscribe(poly => {

        const tileLayer = L.tileLayer('https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_nolabels/{z}/{x}/{y}.png', {
          subdomains: 'abcd',
          maxZoom: 19
        });

        const polyLayer = L.geoJSON(poly, {
          onEachFeature: this.onEachFeature.bind(this)
        });

        this.layers = [ tileLayer, polyLayer ];
        console.log(this);
      });
  }

  // loop through each feature of polyLayer
  onEachFeature(feature, layer) {

    // push polygon names to regions array
    this.regions.push(feature.properties.name);

    layer.on('click', <LeafletMouseEvent> (e) => {
      this.clicked = e.target.feature.properties.name;
      console.log(this.clicked);
    });
  }
}

1 Ответ

0 голосов
/ 05 июня 2018

Функция onEachFeature и обратный вызов события layer.on('click'..., вероятно, вызываются за пределы угловой зоны.Если это так, то обнаружение изменений не будет работать автоматически.Вы должны обернуть изменения в вызовах zone.run(), чтобы убедиться, что ваши изменения вносятся в угловую зону - как в этом примере:

// loop through each feature of polyLayer
onEachFeature(feature, layer) {

  this.zone.run(() => {
    // push polygon names to regions array
    this.regions.push(feature.properties.name);

    layer.on('click', <LeafletMouseEvent> (e) => {
      this.zone.run(() => {
        this.clicked = e.target.feature.properties.name;
        console.log(this.clicked);
      }
    });
  }

}

Вы можете следовать этим указаниям (https://github.com/Asymmetrik/ngx-leaflet#a-note-about-change-detection) чтобы увидеть, как это работает, и добавить экземпляр ngZone в ваш компонент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...