Подтвердить что ты не робот

Вызов функции в службе AngularJS из той же службы?

У меня есть функция AngularJS, определенная следующим образом.

angular.module('myService').service('myService', function() {
  this.publicFunction(param) {
    ...
  };

  this.anotherPublicFunction(param) {
    // how to call publicFunction(param)?
    ...
  };
});    

и я хотел бы назвать первую функцию как извне службы (которая отлично работает с помощью myService.publicFunction(xxx)), так и из другой функции в той же службе, то есть anotherPublicFunction. Ни один из this.publicFunction(param) или myService.publicFunction(param) не будет работать из второй функции, и я могу это понять.


РЕДАКТИРОВАТЬ:
На самом деле вся проблема была вызвана тем, что вы не можете воспроизвести с моим примером. Я передал вторую функцию в качестве параметра обратного вызова в другую функцию в отдельном контроллере, и когда она вызывается, ссылка на this не работает.

например.

anotherService.someCall('a', 123, myService.anotherPublicFunction);

выходит из строя внутри anotherPublicFunction, потому что this не может быть разрешен.

Я написал Plunker, чтобы показать проблему: http://plnkr.co/edit/rrRs9xnZTNInDVdapiqF?p=info

(Я все равно оставлю вопрос здесь, если это поможет кому-то другому.)


Я знаю, что смогу обойти проблему, используя ссылку на службу или первую функцию, подобную этой

var ms = this;
this.anotherPublicFunction(param) {
  ms.publicFunction(param);
  ...
};

или

var pf = this.publicFunction;
this.anotherPublicFunction(param) {
  pf(param);
  ...
};

но оба выглядят как грязные хаки.

Есть ли хороший способ вызвать первую функцию из второго в этом случае? Или я делаю что-то совершенно неправильное, в первую очередь, чтобы иметь такой сервис?

Я нашел эти вопросы с хорошими ответами:

но они отличаются от моей проблемы, поскольку одна из них имеет отдельную внутреннюю функцию, которая должна была вызываться, а другая использовала factory вместо службы.

EDIT:

После публикации этого я сразу понял, что могу это сделать:

var actualWork = function(param) {
  ...
}

this.publicFunction(param) {
  actualWork(param);
};

this.anotherPublicFunction(param) {
  actualWork(param);
  ...
};

что пока не так плохо, как другие варианты до сих пор... Есть ли лучшие подходы?

4b9b3361

Ответ 1

Я думаю, что лучший способ - это:

var myFunctions = 
{

    myFunc1: function(param) {

    },

    myFunc2: function(param) {
       return foo + myFunctions.myFunc1(param)// do some stuff with the first function        
    }

}
return myFunctions;

потому что я думаю, что если вы используете это, это может привести к конфликту с областью использования вами службы.

Ответ 2

Я столкнулся с этой проблемой в своем собственном коде angular и решил использовать эту форму решения:

angular.module('myService').service('myService', function() {
  var myService = this;
  myService.publicFunction(param) {
    ...
  };

  myService.anotherPublicFunction(param) {
    myService.publicFunction(param);
    ...
  };
});

Я предпочел этот подход, потому что в моем коде я использую publicFunction, а внутри anotherPublicFunction я перебираю несколько параметров, которые нужно вызвать publicFunction как часть процесса.

Ответ 3

Звучит неплохо, но что вы делаете, когда this больше не = сервис?

Это в следующем примере:

return {

        myFunc1: function(param) {

        },

        myFunc2: function(param) {

            scope.$watchCollection(param,function(v) {

              return foo + this.myFunc1(param)// do some stuff with the first function 

            }       
        }

}

Из-за function(v) { теперь вы находитесь в другой функции внутри функции, и это больше не служба, а окно.

Ответ 4

Вы можете просто вернуть объект из своего сервиса, например

return {

    myFunc1: function(param) {

    },

    myFunc2: function(param) {
       return foo + this.myFunc1(param)// do some stuff with the first function        
    }

}

Таким образом, вы получаете доступ к нему снаружи с помощью service.myFunc1 и изнутри своих внутренних функций с этим.

Ответ 5

Вы можете установить 'this' как переменную

angular.module('myService').service('myService', function() {
  var that = this;
  this.publicFunction(param) {
    ...
  };

  this.anotherPublicFunction(param) {
    that.publicFunction(param);
  };
});

Ответ 6

вот как я реализовал:

.service('testSvc', function () {
return {
    f1: function (v1) {
        alert('f1 > v1=' + v1);
    },
    f2: function (v2) {
        alert('f2 > v2=' + v2);
        this.f1('az'); //use 'this'
    }
}

})

Ответ 7

Ниже мне помогло: -

 angular.module('myService').service('myService', function() {

    var self= {
        this.publicFunction(param) {
 ...
 };

 this.anotherPublicFunction(param) {
 // You can call the publicfunction like below
 self.publicFunction(param);
 ...
 };
 return self;

 }
 ]);`

Ответ 8

angular.module('myService').service('myService', function() {
    return {
      myFunc2: function(param) {
        return foo + myFunc1(param);
      }
    };
    function myFunc1(param){
        ...
    };
});

Ответ 9

Ну, просто создайте еще две указатели/функциональные переменные для ваших сервисных функций с локальными переменными в сервисе и используйте их для вызова сервисных функций из одной службы:

*

angular.module('myService').service('myService', function() {
  **var ref1, ref2;**
  this.publicFunction = **ref1** = function(param) {
    ...
  };
  this.anotherPublicFunction = **ref2** = function(param) {
    // how to call publicFunction(param)?
    **ref1(argument);**
    ...
  };
});

Ответ 10

Лучший и простой способ вызова:

myapp.service("SomeService", function ($http) {

    this.func1 = function (params) {
        // Some thing the service returns
        return something;
    }

    this.func2 = function (params) {
        // Some thing the service returns
        var resp = this.func1(params);
        return something;
    }
}

Ответ 11

Если вы хотите использовать объявление factory вместо службы, вы можете: -

angular.module('myService').factory('myService', function() {
  var myService = {};
  myService.publicFunction = function(param) {
    ...
  };

  myService.anotherPublicFunction = function(param) {
    // call publicFunction(param) like so
    myService.publicFunction(param);
  };

  return myService;
});