Development Tip

서비스 내에서 $ watch?

yourdevel 2020. 12. 3. 20:44
반응형

서비스 내에서 $ watch?


$watch서비스 내부의 객체 배열에 를 설정할 수 있습니까? ( $watch선언 자체가 서비스 내부에 있기를 원합니다 )?


메서드에 $rootScope첫 번째 인수를 삽입하고 함수를 사용하여 모든 식을 조사 식 집합에 추가 할 수 있습니다 $watch. 의사 코드 :

$rootScope.$watch(function() {
  return //value to be watched;
}, function watchCallback(newValue, oldValue) {
  //react on value change here
});

$watch메서드 에 대한 세 번째 부울 인수를 잊지 마십시오 . true전체 개체의 변경 사항을 자세히 살펴보고 싶은지 여부 를 지정해야합니다 .


그 성격 상 서비스는 클래스와 하우스 방식과 같습니다. 인수가 범위이고 조사 식을 적용하는 컨트롤러에서 호출하는 메서드를 설정할 수 있습니다.

app.service('myservice',function(){
    this.listen = function($scope) {
        $scope.$watch(function(){return someScopeValue},function(){
           //$scope.dosomestuff();
        });
    }
});

//your controller

function myCtrl($scope,myservice) {
    $scope.listen = function() {
        myservice.listen($scope);
    }

    //call your method
    $scope.listen();
}

업데이트 : 서비스 내부의 개인 지역 변수를 감시하려는 경우 $ rootScope를 사용하여 허용 된 답변을 참조하십시오. 위의 것보다 로컬 범위 내에서 $ scope 변수를 $ watch하려고하는 것이 최선의 방법입니다. 그들은 매우 다른 두 가지를 성취하고 있습니다.


달성하고자하는 것을 명확히 할 수 있습니까? 내가 이해했듯이 서버에서 모델로 객체 배열을 가져옵니다. 그렇다면 명확하지 않습니다.

  1. 어레이의 일부 개체가 변경되었는지 확인 하시겠습니까 (반복 풀링을 수행하는 경우 서버에 대한 마지막 호출 이후)?
  2. 배열의 일부 개체가 프런트 엔드 컨트롤 요소를 통해 사용자에 의해 변경되었는지 확인 하시겠습니까?

경우 1의 경우 실제로 $ watch (또는 $ watchCollection)를 사용할 필요는 없지만 서버에서받은 배열을 반복하고 변경 사항을 확인해야합니다 ($ watchColleciton이 수행하는 작업과 동일). 객체가 현재 보유하고있는 객체와 다른 경우이 요소에 대해 object. $ save ()를 호출합니다.

경우 2의 경우 서비스 함수에 매개 변수로 전달 된 $ scope에서 $ watchCollection ()을 사용하거나 $ rootScope에 배열을 보유하는 경우 $ rootScope를 사용합니다.

시나리오를 명확히 해주시면 실제 코드를 제공해 드릴 수 있습니다.


2 개의 다른 컨트롤러에 꽤 큰 시계 설정이있는 상황이있었습니다.

코드를 복제하고 싶지 않았기 때문에 방금 서비스에서 작동하도록 정의했습니다.

angular
    .module('invoice')
    .factory('invoiceState', function () {
        var invoice = {
            client_info: {
                lastname: "",
                firstname: "",
                email: "",
                phone: "",
                id_client: "",
                ... 
             }
        }
        invoice.watchAccommodation = function (newVal, oldVal) {
            var accommodation = newVal;
            //Whatever you would normally have in your watch function
        }

그런 다음 서비스를 삽입 한 컨트롤러의 시계에서이 함수를 호출 할 수 있습니다.

function NewInvoiceCtrl(invoiceState) {
    $scope.$watch('invoice.accommodation',invoiceState.watchAccommodation, true);
}

I do not have much experience with AngularJS so I can't really go into the performance aspects of this approach but it works ;)

참고URL : https://stackoverflow.com/questions/17806600/watch-inside-a-service

반응형