如何将工厂从父模块共享到子模块?

时间:2015-09-02 18:54:14

标签: angularjs

我有一个父模块设置如下:

var app = angular.module("App", ["App.ClsEditor", "App.ClsNotes"]);

app.factory("Helpers", function($sce) {
    var factory = {};

    factory.createHtmlFromMarkdown = function(givenMarkdown) {
        var escapedHtml = $sce.trustAsHtml(marked(givenMarkdown));

        return escapedHtml;
    }

    return factory;
});

我有一个子模块也是这样定义的:

var ClsNotesApp = angular.module("App.ClsNotes", ["ngRoute"]);

ClsNotesApp.controller("NotesCtrl", function($scope, $http, $routeParams, Helpers) {
    $http.get("https://raw.githubusercontent.com/arun-curriculum/Advanced-JavaScript-Two-Day/master/day_1/README.md")
        .then(function(data) {
            var markdown = data.data;

            $scope.output_html = Helpers.createHtmlFromMarkdown(markdown);
            Helpers.highlightMarkdown();
        });
});

对我来说,帮助"助手"子模块(App.ClsNotes)可以立即访问工厂。我得到了一个错误:

未知提供者:HelpersProvider< - 助手< - NotesCtrl

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我建议您创建一个单独的angular模块,您可以将其称为App.Utils,其中可以包含多个组件,例如factoryservicefilter等。通过制作一个新模块将更容易将其注入任何模块和模块中。代码分离规则也会跟着这样做。

<强>代码

var utils = angular.module("App.Utils", ["ngSanitize"]);
utils.factory("Helpers", function($sce) {
    var factory = {};

    factory.createHtmlFromMarkdown = function(givenMarkdown) {
        var escapedHtml = $sce.trustAsHtml(marked(givenMarkdown));

        return escapedHtml;
    }

    return factory;
});

然后controller模块将包含App.Utils

var ClsNotesApp = angular.module("App.ClsNotes", ["ngRoute", "App.Utils"]);

答案 1 :(得分:0)

您需要App模块中的App.ClsNotes模块。如果App.ClsNotes需要来自App的Helpers,这将成为循环依赖。

如果你有辅助方法,它们应该没有来自应用程序的其他依赖项,但如果它们依赖于外部,则可以。

这样,任何依赖这些帮助程序的模块都可以指定依赖项而不存在循环依赖的风险。