我怎么能有requirejs的多个模块实例

时间:2017-03-01 11:52:59

标签: javascript requirejs amd requirejs-define

我尝试使用RequireJS和AMD模块定义,并编写了一个模块,用我认为的对象格式做我的事情。 (我从jquery开始,并没有很好地学习OOP javascript)

myModule.js

define([
    jquery,
    datepicker,
], function ($, datepicker) {
    var myModule = {
        debug: true,
        lang: 'auto',

        initModule: function (element) {
            myModule.element = element;
        },

        // ... other methods
    }

    return myModule;
});

它运作良好,但如果我尝试使用它超过一个元素/时间它会覆盖他自己,我不能在同一页面中多次使用它。

main.js

requirejs(['MyModule'],
    function (MyModule) {

        // all the elements on page
        $elements = $('.element');

        $elements.each(function () {
            MyModule.initModule($(this));
        });
});

当我在页面上有多个<div class="element">时,只有最后一个工作,我认为因为我的模块会覆盖他自己。

我尝试添加new MyModule()但错误TypeError: MyModule is not a constructor

我认为我需要添加一个构造函数或其他东西,在任何情况下都要使用我的模块的实例而不是对象(我认为是由requirejs预编译并返回准备工作)。任何帮助都很好,非常感谢提前!

1 个答案:

答案 0 :(得分:1)

确定!为此!我完全重构了我的代码,而不是在我的模块定义中返回一个对象,我在他的实例之后创建了一个get函数,我创建了一个用于重置属性/变量的构造函数:

myModule.js

define([
    jquery,
    datepicker,
], function ($, datepicker) {
    // constructor
    var myModule = function () {
        // reset lang because it maybe was changed in previous instance, 
        // i think because javascript share this thing trough objects?
        myModule.prototype.lang = 'auto';
    }

    myModule.prototype.debug = true
    myModule.prototype.lang = 'auto';

    myModule.prototype.initModule = function (element) {
        myModule.element = element;
    };

    // ... other methods with `myModule.prototype.` prefix


    return myModule;
});

很好,现在我可以调用myModule trough new myModuel()语法,并为页面上的不同元素提供相同的功能。

main.js

requirejs(['MyModule'],
    function (MyModule) {

        // all the elements on page
        $elements = $('.element');

        var p = 1, _mod = [];
        $elements.each(function () {
            _mod[p] = new MyModule();

            _mod[p].initModule($(this));
            p++;
        });
});

这项工作对我来说,我还不完全理解我做了什么,但我的目的是令人满意的,我可以在页面上为不同的元素重复使用相同的模块功能。

建议我阅读:? 我安全地需要阅读有关OOP Javascript,原型以及javascript如何在内存和名称空间中管理实例/类/对象/ var的内容。