如何在Angular.js项目中使用Require.js加载第三方库

时间:2016-01-13 17:53:12

标签: angularjs requirejs sbt webjars datamaps

真的不明白如何在Angular.js项目中使用Require.js加载第三方库

例如,定义了'topojson',但在这种情况下'datamap'未定义。

此处的数据图https://github.com/markmarkoh/datamaps/blob/master/dist/datamaps.world.js

Topojson来自https://github.com/mbostock/topojson/blob/master/topojson.js

Angular app.js:

'use strict';
requirejs.config({
    paths: {
        'angular': ['../lib/angularjs/angular'],
        'angular-route': ['../lib/angular-route/angular-route'],
        'angular-resource': ['../lib/angular-resource/angular-resource'],
        'angular-animate': ['../lib/angular-animate/angular-animate'],
        'datamap':['../app/dense/world-view/datamaps.world'],
        'topojson':['../app/dense/world-view/topojson'],
        'lodash': ['../lib/lodash/lodash'],
        'd3': ['../lib/d3js/d3']
    },
    shim: {
        'angular': {
            exports: 'angular'
        },
        'angular-route': {
            deps: ['angular'],
            exports: 'angular'
        },
        'angular-resource': {
            deps: ['angular'],
            exports: 'angular'
        },
        'angular-animate': {
            deps: ['angular'],
            exports: 'angular'
        },
        'd3': {
            exports: 'd3'
        },
        'topojson': {
            deps: ['d3'],
            exports: 'topojson'
        },
        'datamaps': {
            deps: ['d3', 'topojson'],
            exports: 'datamaps'
        },
        'lodash': {
            exports: 'lodash'
        }
    }
});

require(
    [
        'angular',
        'topojson',
        'datamap',
        'angular-route',
        'angular-resource',
        'angular-animate',
        'lodash',
        'd3'
    ],
    function (angular, topojson, datamap) {

        console.log("topojson", topojson);
        console.log("datamap", datamap); // is undefined

        angular.module('myApp', [
            'myApp.graph',
            'myApp.node',
            'myApp.dense',
            'ngAnimate',
            'ngRoute'])
            .config(function ($routeProvider) {
                $routeProvider.otherwise({
                    redirectTo: '/login'
                });
            })
        ;

        angular.bootstrap(document.getElementById("myAppId"), ['myApp']);

    });

一些Angular控制器:

'use strict';

define(['angular'], function (angular) {

    angular
        .module('myApp.dense', ['ngRoute'])

        .config(['$routeProvider', function ($routeProvider) {
            $routeProvider.when('/dense', {
                templateUrl: 'assets/app/dense/dense.html',
                controller: 'DenseCtrl'
            });
        }])

        .controller('DenseCtrl', function ($scope) {

            var map = new Datamap({
                scope: 'world',
                element: document.getElementById("someId"),
                projection: 'mercator',
                height: 500,
                fills: {
                    defaultFill: '#f0af0a',
                    lt50: 'rgba(0,244,244,0.9)',
                    gt50: 'red'
                },

                data: {
                }
            });
        })
    ;

});

在我的角度控制器中,新的数据图(...)表示'ReferenceError:未定义数据图'

这不是唯一的情况。 对于大多数外部JS库也是如此。

我在Scala和SBT上使用WebJars运行Angular项目,因此Require.js是如何加载所有内容的唯一方法。

2 个答案:

答案 0 :(得分:0)

除了你的RequireJS模块中的angular之外,我没有看到任何导入(问题中的第二个片段)。您需要添加其他依赖项,例如datamap等。

答案 1 :(得分:-1)

在'数据地图'中看起来像对象未初始化,第12535行:

https://github.com/markmarkoh/datamaps/blob/master/dist/datamaps.world.js#L12535

  // expose library
  if (typeof exports === 'object') {
    d3 = require('d3');
    topojson = require('topojson');
    module.exports = Datamap;
  }
  else if ( typeof define === "function" && define.amd ) {
    define( "datamaps", ["require", "d3", "topojson"], function(require) {
      d3 = require('d3');
      topojson = require('topojson');

      return Datamap;
    });
    // window.Datamap = window.Datamaps = Datamap;  // hack
  }
  else {
    window.Datamap = window.Datamaps = Datamap;
  }

现在它对我有用。 在定义后添加了该行:

window.Datamap = window.Datamaps = Datamap;  // hack

并在Angular控制器中使用了需要块:

 requirejs(["datamaps"], function () {
      // draw map here new Datamap({...})
 };