来自不同模块的Angular注入

Angular injection from different modules

本文关键字:Angular 注入 模块      更新时间:2023-09-26

我得到了这个错误

错误:[ng:areq] http://errors.angularjs.org/1.4.7/ng/areq?p0=fn&p1=not%20a%20function%2C%20got%20undefined

当我尝试下面的

HTML

<div ng-app="angularmodule">
    <div ng-controller="mycontroller">
        <div class="mydirective"  </div>
    </div>
指令

angular
    .module('ui.module', [])
    .directive('mydirective', function () {
        //some directive stuff in here, restricted as ‘C’
            }
        };
    });
工厂

angular
    .module('dataLayerModule', [])
    .factory('datalayer', [$http],
        function (http) {
         //some method in here that uses http request
            return factory;
        });
控制器

angular
    .module(‘angularmodule’, [‘ui.module', 'dataLayerModule'])
     .controller('mycontroller', ['$scope', 'datalayer', function ($scope, datalayer) {
        //this is dependent on two modules being injected i.e. ‘ui.module','dataLayerModule'
    }]);

如果我从上面剥离工厂('dataLayerModule')模块注入,它可以工作,例如

    angular
        .module('angularmodule’, ['ui.module'])
        .controller('mycontroller', ['$scope', function ($scope) {

        }]);

问题是我的'dataLayerModule '注入和它的'数据层'工厂没有被注入,我想。上面的angular javascript代码位于不同的文件中,但都被正确加载到html.

我要做的是将工厂注入控制器,工厂将负责通过ajax获取json数据

这些不同模块的原因是"ui模块"来自第三方,我无法控制。

如果有人能创建一个活塞,这个注入只是正常运行/加载我将非常感激,这是驱使我疯了

在您的factory声明中,您说:

.factory('datalayer', [$http], function (http) {})

但我认为这是你想要的:

.factory('datalayer', ['$http', function (http) {}])

在将$http依赖项注入工厂的方式上存在语法错误,这很可能会破坏工厂代码。当前没有在注入依赖项的数组中包含工厂方法。$http周围也没有引号,它没有被正确注入工厂(当它作为参数传递给函数时,没有$符号)。应该是:

angular
.module('dataLayerModule', [])
.factory('datalayer', ['$http', function($http) {
    //some method in here that uses http request
    return factory;
}]);
替代语法

使用上面的语法(包括依赖项和数组中的函数),很难发现这类错误。另一种更显式的语法是将函数名传递给工厂方法,并进一步声明该函数。

angular
    .module('dataLayerModule', [])
    .factory('datalayer', dataLayer);
dataLayer.$inject = ['$http'];
function dataLayer($http) {
    //some method in here that uses http request
    return factory;
}