在angularjs中覆盖依赖项对象原型

时间:2014-06-05 09:57:14

标签: javascript angularjs dependency-injection loopbackjs

我在名为' App.API'的模块中定义了一组角度$resource。在一个文件中我无法触摸,因为它是生成的。 (使用loopback-angular,一种从服务器端模型定义生成角度$资源的工具)

让我们以Product依赖为例,稍后在应用中,我想覆盖其原型,如下所示:

module('App.NewModule', ['App.API']).run(['Product', function(Product) {
    Product.prototype.getTitle = function() {
        return 'Product name is ' + this.name;
    };
    // From now on I can use p.getTitle() on every Product $resource
});

有效。

问题是,我有许多不同的文件,每个文件都包含模块,我遇到了依赖注入问题:我可以访问getTitle内的NewModule函数,但不在其他内部模块

问题:如何覆盖依赖项对象原型并将其提供给其他模块?

我尝试用这种方式定义原型函数,认为Product原型会被修改。 可能还不够早

module('App.API').run(['Product', function(Product) {
    Product.prototype.getTitle = function() {
        return 'Product name is ' + this.name;
    };
});

它不起作用:在getTitle实例上使用另一个模块中的Product(使用App.API / Product作为依赖项)仍然会引发undefined is not a function错误,即使在{{{ 1}}对象被正确注入。

1 个答案:

答案 0 :(得分:0)

实际上,我只是搞砸了依赖关系定义/命令。

我有三个文件:

    模块app.js
  1. App(取决于模块App.API
  2. 模块api.js
  3. App.API
  4. product.js包含Product原型
  5. 正如问题所述,我在做:

    // in product.js
    module('App.API').run(['Product', function(Product) { ... }]);
    
    // in app.js
    var appModule = module('App', ['App.API']);
    

    但是App.API模块是在另一个文件中定义的,有点搞砸了,因为你永远不知道哪一个会先加载,除非在js加载器中处理并丢失并行下载。

    所以我明确指定了模块和依赖项,代价是在我的应用程序中添加更多依赖项以声明(但它工作且更稳定):

    // in product.js
    module('ApiProduct', ['App.API']).run(['Product', function(Product) { ... }]);
    
    // in app.js
    var appModule = module('App', ['App.API', 'ApiProduct']);
    

    注意:在我的第一次尝试中,我在.config()块中的新模块中定义了原型,但它无效,可能是因为尚未加载App.API服务。使用.run()它可以正常工作,我的getTitle原型可以在我需要Product提供商的任何地方使用。