我可以将一个方法添加到另一个模块中用作依赖项的requirejs模块,并在每次将模块作为依赖项加载时使用它吗?

时间:2013-07-23 13:05:59

标签: javascript module dependencies requirejs

如果我有这样的模块:

define([
   'app'
  , 'text!index.html!strip'
  , 'css!index'
  ],
  function (App, source) {
    var response = {};

    App.newMethod = function (foo) {
      console.log("foo ="+foo);
    };

  // return response object
  return response;
  }
);

我想知道如何将方法添加到另一个模块中用作依赖关系的模块。当然我可以向对象添加方法,但是当从另一个模块调用它时,它们还会更新App对象吗?

问题
有没有办法将方法添加到模块中,该模块作为依赖项加载并且所有模块都可以使用这些方法,这需要这种依赖性?

1 个答案:

答案 0 :(得分:4)

简答:

是。该模块需要是一个对象/实例(不是一个类),它将与requirejs一起使用。

答案很长:

当你第一次需要一个模块作为依赖时,Requirejs会生成一个对象,并且下次需要模块时,Requirejs将返回它第一次生成的对象。因此,无论何时您需要一个模块,您始终可以获得对象的相同参考。

使用

define([], function () {
    var app =  {
        //my methods.
    };

    return app;
});

define(['app'], function (app) {
    app.newMethod = function (){
        // ...
    };
});

你可以使用这样的应用程序:

define(['app'], function (app) {
    app.newMethod();
});

但是从一个对象到另一个对象的注入方法是一种非常糟糕的做法。如果你需要来自对象的东西,只需在创建对象时添加它,而不是通过注入。

define([], function () {
    var app =  {
        newMethod: function () {
            // ...
        },
        // my methods.
    };

    return app;
});

例如,如果对象A注入将在对象B中使用的新方法,但在未加载B时调用A则会出现错误Object #<Object> has no method 'newMethod'