1

단일 페이지 AngularJS 웹 앱을 만들고 있습니다. 내 응용 프로그램은 사용자 상태에 대한 정보를 얻기 위해 백엔드 서비스를 쿼리 할 수 ​​있어야하며이 상태 정보는 단일 페이지 응용 프로그램의 다양한 부분에서 사용할 수 있어야합니다. 이 기능을 관리하는 서비스를 만들었지 만 나에게 합리적인 방식으로 문제를 해결하는 데 어려움을 겪고 있습니다.

처음,이 같은 설정 것들 ... 내 컨트롤러에서 다음

<service.js> 
... 
var url = 'www.my-backend.com'; 
this.val = [ 
    { 
     name: 'undefined', 
     isValid: false 
    } 
]; 
$http.get(url, {}) 
    .success (function (data) { 
     this.val = data; 
    }) 
    .error (function() { 
     this.val = [ 
      { 
       name: 'error', 
       isValid: false 
      } 
     ]; 
    }); 
... 

그리고 ...

<controller.js> 
... 
$scope.val = service.val 
... 

이 그래도 작동하지 않았다 (val.name는 '정의되지'하고 있었다) 아마도 service.valget 요청이 종료 될 수 있기 전에 컨트롤러 $ 범위에 바인딩 되었기 때문일 수 있습니다. 그러나, 그것은 내가 읽은 것과 확답이 같지 않습니다. here.

나는이이었다 한 다음 일은 ...

<service.js> 
... 
var url = 'www.my-backend.com'; 
this.valPromise = $http.get(url, {}); 
... 

그리고 내 컨트롤러에서 ...

<controller.js> 
... 
$scope.val = [ 
    { 
     name: 'undefined', 
     isValid: false 
    } 
]; 
service.valPromise 
    .success (function (data) { 
     $scope.val = data; 
    }) 
    .error (function() { 
     $scope.val = [ 
      { 
       name: 'error', 
       isValid: false 
      } 
     ]; 
    }); 
... 

는이 일을하지만, 나는 그것을 좋아하지 않았다. 나는 그 논리가 서비스에 속한 것처럼 느낀다.

그래서 내가 한 일은 희망적인 효과가있는 것으로 보이지는 않지만 here이라는 다양한 제안을 통해 작업 한 것입니다. 나도 this를 보았다. 그러나 그것은 과잉과 같게 정말로 나의 문제에 적용 할 수 없다.

이상적으로는 (내 서비스 변수를 참조로 내 컨트롤러 범위에 단단히 묶는) 첫 번째 시도를 수행하는 방법을 실제로 알고 싶습니다. 그러나 이것이 각도 프레임 워크 내에서 실제로 수행 될 수있는 것이 아니라면, 어떤 종류의 watch 동작을 사용하게되어 기쁩니다. 누구나 내가 잘못하고있는 것을 발견 할 수 있습니까? 아니면 내 서비스 변수가 내 컨트롤러에 제대로 연결되지 않는 이유는 무엇입니까?

+1

'$ http' 콜백에서'this'는 서비스가 아닙니다. – zeroflagL

+0

그러면 올바른 구문은 무엇입니까? –

답변

2

$http 콜백에서 this은 서비스가 아닙니다. SO에 관한 this의 의미에 대한 많은 답을 찾을 수 있습니다. 변수를 통해 서비스를 참조해야합니다.

두 번째 문제는 this.val = data;이 서비스에 새 값을 할당하지만 이전 배열을 계속 가리키는 범위의 데이터는 변경하지 않는다는 것입니다. 따라서 새 데이터를 기존 배열에 복사해야합니다.

var service = this; 
$http.get(url, {}) 
.success (function (data) { 
    angular.copy(data, service.val); 
}) 
+0

내가 만든 오류를 지적한 것처럼 보였으므로 귀하의 답변에 대해 찬성표를 던졌지 만 답변을 찾지 못했지만 답변의 마지막 부분에서 그 점을 인정할 수는 있습니다. 당신의 제안에 따라, 나는 내 서비스에서'this '를 변수'service'에 바인딩하고, 콜백에서는'service.val'의 값을 설정합니다.내 컨트롤러에 의해 제어되는 페이지에서 데이터를 채우기 위해 서비스에서 반환 된 정보를 사용하고 싶지만, 해당 페이지가'name.val'을로드 할 때 여전히 '정의되지 않음'이므로 내 페이지에 유용한 정보가 표시되지 않습니다. 내가 놓친 게 있니? –

+0

@ DanForbes'{{val.name}} '과 같이 페이지에서 사용하면'name'이 업데이트 될 때 정말로 중요하지 않습니다. 어떻게 사용합니까? – zeroflagL

+0

'{{val.name}} '처럼 사용하지 않습니다. 선택 상자를 채우는 데 사용합니다 :'