source

Angular에서 함수 호출같은 서비스의 JS 서비스?

myloves 2023. 3. 4. 15:27

Angular에서 함수 호출같은 서비스의 JS 서비스?

나는 Angular를 가지고 있다.다음과 같이 정의된 JS 서비스

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

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

그리고 첫 번째 함수는 서비스 외부에서 호출하고 싶습니다.myService.publicFunction(xxx)같은 서비스의 다른 기능, 즉anotherPublicFunction두 번째 기능 중 어느 쪽도 기능하지 않거나 기능하지 않는 것은 이해할 수 있습니다.


편집:
사실 이 모든 문제는 제 예만으로는 재현할 수 없는 어떤 것 때문에 발생했습니다.콜백 파라미터로서 두 번째 함수를 다른 컨트롤러의 다른 함수에 전달했습니다.이 함수가 호출되었을 때 참조는this동작하지 않습니다.

예.

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

내부에서 실패하다anotherPublicFunction왜냐면this해결할 수 없습니다.

문제를 보여주기 위해 플런커를 작성했습니다. 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);
  ...
};

둘 다 더러운 해커처럼 보여요

이 경우 첫 번째 함수에서 두 번째 함수를 호출할 수 있는 좋은 방법이 있습니까?아니면 제가 이런 서비스를 받기 위해 애초에 완전히 잘못된 일을 하고 있는 걸까요?

나는 다음과 같은 질문들을 좋은 답변과 함께 발견했다.

하지만 하나는 호출해야 하는 별도의 내부 기능이 있고, 다른 하나는 서비스 대신 공장을 사용하고 있기 때문에 제 문제와 다릅니다.

편집:

이것을 투고하고 나서, 이것 또한 할 수 있다는 것을 즉시 깨달았습니다.

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

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

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

지금까지의 다른 선택지만큼 나쁘지 않은 것 같은데...더 나은 방법이 있을까요?

가장 좋은 방법은 다음과 같습니다.

var myFunctions = 
{

    myFunc1: function(param) {

    },

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

}
return myFunctions;

이것을 사용하면 서비스 범위와 상충될 수 있기 때문입니다.

저는 이 문제에 부딪혔고, 다음과 같은 형태의 솔루션을 사용하기로 결정했습니다.

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

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

코드에서 publicFunction을 사용하고 다른 PublicFunction 내부에서는 프로세스의 일부로 publicFunction을 호출해야 하는 몇 가지 매개 변수를 루프하기 때문에 이 방법을 선호합니다.

좋아요, 하지만 어떻게 해요?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) {이제 기능 내의 다른 기능으로 이동하게 되며, 이것은 더 이상 서비스가 아닌 창입니다.

서비스 내에서 다음과 같은 객체를 반환할 수 있습니다.

return {

    myFunc1: function(param) {

    },

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

}

외부에서 .service.myFunc1내부 기능으로부터 이 기능을 가지고 있습니다.

'this'를 변수로 설정할 수 있습니다.

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

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

로컬 변수를 사용하여 서비스 기능을 위한 포인터/함수 변수를 2개 더 만들고 그것들을 사용하여 동일한 서비스 내에서 서비스 기능을 호출합니다.

*

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);**
    ...
  };
});

실장 방법은 다음과 같습니다.

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

})

아래 솔루션이 효과가 있었습니다.-

 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;

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

전화하는 가장 쉬운 방법은 다음과 같습니다.

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;
    }
}

서비스 대신 공장 신고서를 사용하는 경우 다음을 수행할 수 있습니다.

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;
});    

언급URL : https://stackoverflow.com/questions/19842669/calling-a-function-in-angularjs-service-from-the-same-service