Angular Service创建的函数需要此关键字

时间:2016-10-26 05:11:30

标签: javascript angularjs

虽然问题更多,我认为javascript类型问题比Angular问题更多,我正在创建一个服务,我会像这样称呼它

// controller injects activityApi , then service function call is made
var activities = activityApi.getActivityById(1122);

如果我没有在功能名称前添加“this”关键字,则会出错 1.为什么我需要“这个” 2.还有什么其他选择? (我试图养成不用function blah() { ... }

做旧学校javascript的习惯
this.getActivityById = function(id) {
        $http.get('/Umbraco/Api/ActivityApi/GetActivity').
            success(function (data, status, headers, config) {
            console.log(data);
            return data;
            }).
       error(function (data, status, headers, config) {
           // log error
       });
    };

3 个答案:

答案 0 :(得分:1)

如果您正在写工厂,请在工厂内使用一个物品,并将所有电话都放入其中。如

(function() {
    'use strict';

    angular
        .module('app')
        .factory('activityApi', activityApi);

    activityApi.$inject = ['$http'];

    function activityApi($http) {
        var service = {
              getActivityById : getActivityById ,
        };
        return service;


     function getActivityById (id) {
        $http.get('/Umbraco/Api/ActivityApi/GetActivity').
          success(function (data, status, headers, config) {
           console.log(data);
           return data;
        }).
       error(function (data, status, headers, config) {
          // log error
       });
    };

    };
})();

这里你返回的工厂对象中有调用函数。

您可以在此处调用工厂函数

var activities = activityApi.getActivityById(1122);

答案 1 :(得分:0)

关于角色的服务和工厂。 .service.factory都返回函数。但是,有角度的$injector使用.service关键字调用new返回的函数(使用$instantiate方法),而调用.factory函数则是使用invoke方法。由于它使用new关键字作为服务函数,因此您必须在函数内部使用this关键字来引用由new创建并从函数返回的对象。

正如@NikhilVM所示,如果您想避免使用此功能,则可以使用factory代替service。服务和factory返回值都被缓存,因此如果工厂返回一个对象,它将变为全局。因此,从这个意义上来说,service使用this来添加方法没有什么不同。使用factory的优点在于,您可以返回一个函数构造函数,以便稍后调用以实例化多个类实例,而不能使用.service执行该操作。

答案 2 :(得分:0)

如果您希望未来保持一致,您将需要使用工厂服务。

  

那么对方是否有任何优势呢?就在这里。事实证明,在迁移到ES6时,尽可能使用服务更好。原因很简单,一个服务是一个构造函数而一个工厂不是。在ES5中使用构造函数允许我们在迁移到ES6时轻松使用ES6类。

参考 - 一些Angular 2创作团队的Angular guru Master(网站上说) 这是一个很好的阅读 http://blog.thoughtram.io/angular/2015/07/07/service-vs-factory-once-and-for-all.html

  1. 将您的服务与this一起使用 或
  2. 像OP提议的那样使用工厂