在指令和单元测试套件中使用原生javascript插件

Working with native javascript plugin in directive and unit test suite

本文关键字:原生 javascript 插件 指令 单元测试 套件      更新时间:2023-09-26

我有一个原生javascript插件,它被包装在一个指令中,并以angular的方式使用。

几行指令,

export default function () {
'use strict';
return {
    restrict: 'E',
    scope: {
        map: '=',
        options: '='
    },
    replace: true,
    template: '<div id="map" class="leaflet-map"></div>'
    link: function(scope, element, attrs) {
        //This code of native js class that 
        //is injecting svg inside given template
        scope.map = new MP.Map(scope.options);       
    }
  };
}
HTML

<mp-map options="opt" map="mapOpt"></mp-map>
预期HTML

<div id="map"><svg>.. nodes of map .. </svg></div>

首先,我试图访问mapOpt(即Mp的实例。在init上映射或绑定原生js类(在指令的link方法中),但无法获得MP的实例。在angular控制器中映射。然后我尝试使用$timeout(没有任何异步数据),所以它工作了。

其次,我为指令写了一个单元测试,以确保<mp-map>被指令的模板取代。但是它会抛出错误"Map container not found"(即本机代码抛出的错误)。

看来,我定义指令的第一步是错误的。

向盎格鲁人寻求帮助。

我希望能及时得到帮助。

谢谢。


EDIT:几行MP类(自定义类)

FP.Map = L.Class.extend({
  options: {
              container: 'map',
              .....
           },
  ....
  // Map options
  this.options.map = L.extend(this.options.map, options.map);
  this.map = L.map(this.container, this.options.map);
})

抛出错误"Map container not found"(即本机代码抛出的错误)。

你的MP如何?映射实例知道使用什么元素吗?使用传单,您添加您想要使用的元素作为第一个参数,选项对象作为第二个:new L.Map(element[0], scope.options);我看到你在做:new MP.Map(scope.options);你的MP。Map不知道该使用什么元素。很难说,因为我和谷歌完全不熟悉MP.map。这和传单有什么关系?也许你可以分享一些代码。

无法获取MP实例。映射到angular控制器

控制器代码在指令的link函数之前运行。所以当你尝试通过控制器中的$scope.map访问map实例时,它还不可用。有多种方法可以解决这个问题。

  1. $scope.map上使用$watch并等待实例:http://plnkr.co/edit/N9DwdHQUIzxhqax6mwMm?p=preview
  2. scope.$broadcast一个事件实例化后,并捕获它在你的控制器:http://plnkr.co/edit/QB8fXMM67FD4NgMS49j7?p=preview
  3. 在你的控制器中绑定回调函数:http://plnkr.co/edit/PFvJzSliDo8uLFk8HgOi?p=preview
  4. 在服务中创建一个承诺并解析它:http://plnkr.co/edit/DoJpGqtR7TWmKAeBZiYJ?p=preview