创建自定义模块

时间:2015-10-08 21:07:34

标签: javascript angularjs

我正在尝试创建一个可能被多个应用程序使用的模块。我在这里看到了几个关于这个问题的问题,并不是一个真正的标准方法。就我的目的而言,模块似乎是最好的选择。

我将模块注入我想要使用它的控制器,但我似乎无法在模块上公开方法。这是模块中的相关代码:

(function (ng) {
"use strict";
angular.module('oDataHelpers', [])

angular.module('oDataHelpers').value("oDataHelpers", oDataHelpers)


function oDataHelpers() {
    var module = this; 
    module.getKeyFromURL = getKeyFromURL;
    module.buildQueryString = buildQueryString;

    // assumes the last value on a URL represents a key value
    function getKeyFromURL() {
        return "myString";
    };


    function buildQueryString(container, propertyList, operators, fieldList) {
        return "my other string";
    };
    return ({module: getKeyFromURL, module: buildQueryString});
}

})(角度);

当我在我的一个控制器中运行一个方法时,我可以在调试器中看到oDataHelpers,但是没有一个方法,当然,当我尝试调用其中一个方法时,我收到一个错误,指示该方法是不是一个功能。我错过了什么?

3 个答案:

答案 0 :(得分:1)

你正朝着正确的方向前进。首先,value提供了一个直接值,因此引用oDataHelpers将获得函数而不是对象。您的模式实际上是factory

另一件事是angular.module(name, []) 定义模块,而angular.module(name) 加载模块。因此,第二次angular.module电话是不必要的。

记住这些(有一些额外的修复):

(function (angular) {
"use strict";
angular.module('oDataHelpers', []).factory("oDataHelpers", function() {
    var module = {}; 
    module.getKeyFromURL = getKeyFromURL;
    module.buildQueryString = buildQueryString;

    // assumes the last value on a URL represents a key value
    function getKeyFromURL() {
        return "myString";
    };

    function buildQueryString(container, propertyList, operators, fieldList) {
        return "my other string";
    };
    return module;
});
})(angular);

答案 1 :(得分:0)

我认为我发布了我最终做的相关部分,因为我还没有真正看到其他地方似乎坚持当前最佳实践的解决方案。这主要基于@ tcooc的答案以及Ben Nadel在此处发现的博客文章:enter image description here

(function(ng){     "使用严格的&#34 ;;

angular.module('oDataHelpers',[]).factory("oDataHelpers", oDataHelpers)

function oDataHelpers() {
    var module = this; 
    module.getKeyFromURL = getKeyFromURL;
    module.buildQueryString = buildQueryString;

    function getKeyFromURL() {
        return "string" ;
    };

    function buildQueryString(container, propertyList, operators, fieldList) {
            return "my string" ;
    };
    return module;
}

})(angular);

这对我来说非常合适,并且没有引用我应用的其他部分,所以我可以在其他地方自由使用它。

答案 2 :(得分:-1)

首先,我将此设置为服务或工厂,但无论如何都应该有效。

return是错误的...你在一个无效的对象中有重复的属性名称,但是当需要返回的对象已被定义为{{{}时,你不需要返回该对象1}}

尝试:

module

相同
return module;

至于创建一个可移植性的角度模块......这就是模块化的全部意义所在!