【问题标题】:Getting nested angular modules to inject properly让嵌套的角度模块正确注入
【发布时间】:2014-04-21 19:23:56
【问题描述】:

我在将角度烤面包机服务注入我拥有的工厂对象时遇到问题,当我在没有错误的情况下注入烤面包机时,烤面包机上的 ngAnimate 注入失败。据我所知,我做得正确,所以我不确定我在这里错过了什么。

错误信息:

Uncaught Error: [$injector:modulerr] Failed to instantiate module apptSetting due to:
Error: [$injector:modulerr] Failed to instantiate module toaster due to:
Error: [$injector:modulerr] Failed to instantiate module ngAnimate due to:
Error: [$injec...<omitted>...1) 

主应用文件:

//创建初始的angular应用模块

var app = angular.module("testApp", ['angularSpinner', 'ngResource', 'ui.bootstrap', 'toaster', 'app.controllers', 'app.factories']);
angular.module("app.factories", []);
angular.module("app.controllers", []);

工厂文件:

angular.module('app.factories').factory('dataFactory', ['$rootScope', '$resource', '$http', 'toaster', function ($rootScope, $resource, $http, toaster) {
return {
    UpdateOrderStatus: function(orderId) {
        return $http({
            url: "/path/UpdateOrderStatus",
            dataType: "json",
            method: "POST",
            data: { orderId: orderId },
            headers: {
                "Content-Type": "application/json; charset=utf-8"
            }
        }).success(function(order) {
            toaster.pop('success', "Order status Update", "Order status successfully updated.");
        }).error(function() {
            //toaster.error("Order status update failed.");
        });
    }

部分烤面包机文件:

angular.module('toaster', ['ngAnimate'])
.service('toaster', ['$rootScope', function ($rootScope) {
this.pop = function (type, title, body, timeout, bodyOutputType) {
    this.toast = {
        type: type,
        title: title,
        body: body,
        timeout: timeout,
        bodyOutputType: bodyOutputType
    };
    $rootScope.$broadcast('toaster-newToast');
};

按顺序列出的脚本:

                    "~/Scripts/angular.js",
                    "~/Scripts/angular-resource.js", 
                    "~/Scripts/ui-bootstrap-tpls-0.10.0.js",
                    "~/Scripts/spin.js",
                    "~/Scritps/angular-animate.min.js",
                    "~/Scripts/toaster.js",
                    "~/Scripts/ApptSettingApp.js",
                    "~/Scripts/angular-spinner.js",
                    "~/Scripts/dataFactory.js",

对此问题的更新:

我发现了这个问题,我在 .net 应用程序中使用 angular,并且我的脚本都是使用我的应用程序中的捆绑程序呈现的。即使脚本文件引用相同,并且烤面包机引用是正确的。如果您将标签添加到页面,源自相同的脚本文件,它将正常工作。然而,这并不能解决问题,它确实可以更深入地了解原因。

【问题讨论】:

  • 这些是单独的文件吗?你有每个的脚本标签吗?它们的顺序是否正确?
  • 据我所知,是的,我按顺序添加了脚本列表。

标签: angularjs angularjs-factory angularjs-module


【解决方案1】:

嗯,

问题背后的原因很简单,我不止一次加载同名的服务......但是,如果您不知道 Angular 如何处理注入同名对象,则结果行为很常见.在我的例子中,我在我的主应用程序中加载了烤面包机模块,在那里我创建了应用程序所需的所有模块。然后我将指令添加到 html 页面,以便烤面包机可以显示消息,这导致再次加载烤面包机服务,但没有提供程序(我假设因为它已经加载到主应用程序中),因此提供程序错误。

最初为了修复它,我在页面上添加了一个脚本标签,一切正常,但由于我希望这是一个全局消息传递场景,不得不在每个页面上添加一个脚本标签让我很困扰,所以我一直在挖掘.

那时我注意到指令再次加载服务。所以它在主模块中加载,然后指令正在加载它,最后在页面上脚本标签覆盖了前两个实现。因此,正确修复是不将其加载到主应用程序中,从 html 页面中删除脚本标签,而只需将指令添加到页面中。

这种行为是 Angular 处理注入同名对象的方式的结果,最终一方获胜。

我希望这对遇到类似情况的下一个人有所帮助。

【讨论】:

    【解决方案2】:

    toaster 模块添加到app.factories 依赖项,因为toasterdataFactory 位于不同的模块中。

    angular.module("app.factories", ['toaster']);
    

    【讨论】:

    • 那么问题可能是ngAnimate模块没有被加载。
    • 是的......这就是问题所在,但 ngAnimate 是烤面包机服务的一部分,如果我要从控制器使用它,它会正常工作,但我想将它注入我自己的服务,以便我可以从我的服务返回消息。
    猜你喜欢
    • 2017-05-09
    • 2019-11-07
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多