【问题标题】:Can't redefine service defined as constant无法重新定义定义为常量的服务
【发布时间】:2015-06-13 14:07:31
【问题描述】:

这是我的 temp.js

angular.module('temp', [])
    .service('tempFactory', function() {
        this.a =10;
    });

这是我的 temp.Spec.js

describe('temp', function() {
    var tempFactory;

    beforeEach(function() {
        var mockedTempFactory = {};

        module('temp', function($provide) {
            $provide.value('tempFactory', mockedTempFactory);
        });

        mockedTempFactory.a = 20;

        inject(function(_tempFactory_) {
            tempFactory = _tempFactory_;
        });
    });

it('console.log of a property', function() {
    console.log(tempFactory.a);
});

});

在控制台中我得到 20 的值。

但如果我这样定义 tempFactory:

angular.module('temp', [])
    .constant('tempFactory', {
        a: 10;
    });

在控制台中我得到 10 的值。

为什么我不能重新定义最初定义为常量的 tempFactory,但可以重新定义最初定义为服务、值或工厂的 tempFactory?

【问题讨论】:

    标签: angularjs unit-testing jasmine karma-runner sinon


    【解决方案1】:

    因为当你创建一个服务时,你给它提供了一个构造函数

    .service('tempFactory', function() {
        this.a = 10;
    })
    

    Angular 然后创建这个函数的一个实例,有点像这样:

    var tempFactoryInstance = new tempFactory();
    return tempFactoryInstance;
    

    并准确返回该实例,因此您可以立即访问 a 属性。

    但是 constant 并没有做任何事情,它只是返回你传递给它的东西,所以

    .constant('tempFactory', function() {
        this.a = 10;
    })
    

    只会返回一个函数给你。如果您希望在这种情况下能够访问属性a,那么您必须“实例化”它:

    var instance = new tempFactory();
    console.log(instance.a); // 10
    

    请参阅plunker

    您可以阅读更多关于不同提供商in the documentation 的行为。

    【讨论】:

    • 我已经更正了我的示例,现在它是对象,而不是函数。无论如何,我不明白为什么我可以使用 value 重新定义服务、工厂和 value,但不能使用 value 方法重新定义常量。我可以使用常量方法重新定义常量。
    • 好的,抱歉,我误解了这个问题。我认为原因在于这些提供者是如何创建的。如果你查看源代码here,你会看到servicevalue使用factory,而constant以单独的方式处理。
    猜你喜欢
    • 2019-05-27
    • 2012-12-06
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多