如何使用正式自定义模板初始化传单地图?

How to initialize a leaflet map using formly custom template?

我正在使用 Angular-Formly 创建一个表单,您可以在其中输入地址,它 returns 是本地地图。我使用以下内容创建了自定义模板:

<script type="text/ng-template" id="leaflet-map-template.html"> <div id="[options.key]"></div> </script>

并将类型设置为 angular.module 与其他模块:

var app = angular.module('formlyExample', [
    'ngAnimate',
    'ngSanitize',
    'ngTouch',
    'formly',
    'formlyBootstrap',
    'ui.bootstrap'
  ], function config(formlyConfigProvider) {
    // set custom template here
    formlyConfigProvider.setType({
      name: 'leaflet-map',
      templateUrl: 'leaflet-map-template.html'
    });
  });

但在现场我不知道如何初始化传单地图。这是我的字段数组的一部分:

vm.formFields = [
//other fields come here
//leaflet map template
{
  key: 'mymap',
  type: 'leaflet-map',
  templateOptions: {
  label: 'Leaflet Map'
  },
  controller: /* @ngInject */ function($scope) {
    var initialCoordinates = [-23.0895164, -47.2187371];
    // initialize map with initial coordinates
    var map = L.map($scope.options.key, {
      center: initialCoordinates,
      zoom: 14,
      zoomControl: false
    });
  }
}];

--编辑-- 它给我的错误是:Map container not found,因为它找不到 div.

这不起作用,因为控制器将在 DOM 中没有具有正确 ID 的元素时被调用,因为 Formly 尚未应用模板。

所以...如何解决?首先,您应该使用 link 函数而不是 controller,因为 link 函数是在 Angular 中进行 DOM 操作的默认位置。

此外,为了避免每次实例化地图字段时都必须提供 link 函数,请将 link 函数放在类型定义中,而不是字段定义中。

最后,link 函数接收封闭元素作为第二个参数,因此要获得 div 只需获得封闭元素的第一个子元素即可。

代码将如下所示:

formlyConfigProvider.setType({
  name: 'leafletmap',
  templateUrl: 'leaflet-map-template.html',
  link: function(scope, el) {
    // initialize map with initial coordinates
    var initialCoordinates = [-23.0895164, -47.2187371];
    // get first child of the enclosing element - the <div>!
    var mapDiv = el.children()[0];
    var map = L.map(mapDiv, {
      center: initialCoordinates,
      zoom: 14,
      zoomControl: false
    });
  }
});

哦,有两件事我忘了告诉你:

首先,如果您想将字段键作为 ID 传递,您应该像使用双花括号的常规 angular 模板一样完成:

<script type="text/ng-template" id="leaflet-map-template.html">
  <div id="{{options.key}}"></div>
</script>

最后,您不需要在 div 中放置 ID,因为我们使用封闭字段元素的第一个子元素来 select 它。 :)

总结一下,我在 codepen 上放了一个最小的工作示例,看一下: https://codepen.io/sigriston/pen/OXxPPb