program story

동일한 서비스에서 AngularJS 서비스의 함수를 호출합니까?

inputbox 2020. 10. 22. 07:59
반응형

동일한 서비스에서 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);
  ...
};

그러나 둘 다 더러운 해킹처럼 보입니다.

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

다음 질문에 좋은 답변을 찾았습니다.

그러나 그들 중 하나는 호출 될 별도의 내부 기능이 있고 다른 하나는 서비스 대신 공장을 사용했기 때문에 내 문제와 다릅니다.

편집하다:

이것을 게시 한 후 나는 즉시 이것을 할 수 있다는 것을 깨달았습니다.

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을 사용하고 anotherPublicFunction 내부에서 프로세스의 일부로 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);
  };
});

글쎄, 서비스에서 로컬 변수를 사용하여 서비스 함수에 대한 포인터 / 함수 변수를 두 개 더 만들고이를 사용하여 동일한 서비스 내에서 서비스 함수를 호출합니다.

*

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

반응형