AngularJS:在多个模块之间共享工厂

6

假设我有一个名为App的模块,它注入了两个其他模块,分别是工厂控制器

var app = angular.module("app", ["factories", "controllers", "directives"])
.run(function ($rootScope, userFactory) {
    userFactory.property = "someKickstartValue";
});

“factories(工厂)”模块包含所有的工厂:

var factories = angular.module("factories", []),
factory = factories.factory("testFactory", {
     property: "someValue"
});

控制器模块包含所有的控制器:

var controllers = angular.module("controllers", ["factories"]),
controller = controllers.controller("controller", function ($scope, testFactory) {
    console.log(testFactory.property); // Returns "Some Value" and not 
                                       // "someKickstartValue" as expected.
});

实际问题:

为什么“someKickstartValue”不适用于控制器?据我所了解,模块app有它自己的testFactory实例,而模块controllers也有它自己的实例,因此不能通过工厂在模块之间共享信息。还有其他解决方法吗?或者是我的错误?


在第一行,从“var app”开始,您拼错了“factories”。 - Mawg says reinstate Monica
@Mawg 谢谢。我已经更改了。现在应该是正确的 :) - tmuecksch
2个回答

6
我通过移除控制器的“factories”依赖项来解决了这个问题。
var controllers = angular.module("controllers", []),
controller = controllers.controller("controller", function ($scope, testFactory) {
    console.log(testFactory.property); // Returns "someKickstartValue" as expected
});

因为我现在不再将工厂声明为依赖项,所以控制器模块不会创建它自己的工厂实例,并且可以访问注入了控制器模块的应用模块的实例。


你确定这是正确的做法吗?通过注入到应用程序中,你会将其注入到该应用程序的所有控制器中。如果只有一些控制器需要“工厂”依赖项,为什么不仅注入到这些控制器中,而不是整个应用程序?请注意,我不是Angular大师。 - Mawg says reinstate Monica
1
@Mawg 同时,我已经转向使用Angular 4。所以这个问题不再是我记忆中的新鲜事物了。但据我所记,你可能是正确的。只需尝试一下,在开头帖子的第一行中删除“factories”注入,看看会发生什么。 - tmuecksch
我想自己进行转换,但我不确定现在是否是合适的时间。例如,您知道Angular 4是否可以使用UI-bootstrap或其他Angular 1.x的东西吗? - Mawg says reinstate Monica
1
简短回答:不,你不能简单地使用这些依赖项。但是许多库已经创建了兼容的新版本。例如,请参见:https://ng-bootstrap.github.io/#/home - tmuecksch

3

我也遇到了同样的问题。 我以下面的方法解决了它:

// modules.js
(function (angular) {
    angular.module("shared", []);
    angular.module("user", ["shared"]);
    angular.module("admin", ["shared"]);
})(window.angular);

这种结构允许在其他模块中使用工厂、服务和指令,这些工厂、服务和指令与 共享 模块相关。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接