角度的不同类型的提供者配置

时间:2016-06-15 12:35:09

标签: javascript angularjs angular-providers

从互联网上的不同资源中学习角度让人感到困惑。每个人都使用不同类型的模式来编写函数。请注意这个.provider concept

我尝试.provider有4种不同的模式,而且都在运作

模式A :使用return

中的所有功能
app.provider('other', function() {
    name ="Default";
    return {
        $get: function () {
                return {
                    sayHello: function () { console.log('provider example say my name is :' + name )}
                }
        },
        setName: function (newName) {
            name = newName;
        }
    };
}); 

模式B:使用this并区分$ get和其他方法

app.provider('other', function() {
    this.name ="Default";
    this.$get = function () {
        var name = this.name;
        return {
            sayHello: function () { console.log('provider example say my name is :' + name )}
        };
    };

    this.setName = function(name) {
        this.name = name;
    };
});

模式C:也在返回的函数之前使用数组[ ]找到了某处

this.$get = [function () {
        var name = this.name;
        return {
            sayHello: function () { console.log('provider example say my name is :' + name )}
        }
    }];

UPADTE

模式D:,带有.factory,然后 functionNameProvider。$ get.methodName() with .config

app.factory('alpha', function(){
        var c = ['Cadbury','Perk','Dairy Milk'];
        return {
            sayHello: function() { console.log('Hello, I am from Provider');},
            getAllData: function() { return c; }
        };
});

然后

app.config(['alphaProvider',function(alphaProvider) {
 console.group('Checking Factory Pattern');
 alphaProvider.$get().sayHello();
 var cdata = alphaProvider.$get().getAllData();
 console.log(cdata);
 console.groupEnd();
}]);

为此创建了jsfiddle,请告诉我哪种方式正确/首选?

1 个答案:

答案 0 :(得分:3)

模式A和B都是创建提供者/服务的正确方法。

传递给function方法的provider()是提供程序实例的构造函数。 Provider实例只是一个$get方法的对象。您有两种选择如何实例化它:

  • 从构造函数(模式A
  • 中显式返回提供程序实例
  • 使用this语法并且不从构造函数(模式B )返回任何内容。在这种情况下,angular将创建一个提供者实例作为新的Object并对其运行构造函数(绑定this)。

模式C Inline Array Annotation - 一种指定组件/功能的依赖关系的方法。该数组应该包含依赖项的名称,后面跟着您希望它们注入的function。可以与A和B两种方法一起使用。

<强>更新

正如 @estus 所指出的,B方法更有效,因为在A的情况下,新的Object也被创建但从未使用过。