2014-01-15 2 views
1

신뢰할 수없는 연결 (예 : 모바일)에서 계속 작동하는 각도 애플리케이션을 제작하려고합니다.순환 종속성 오류없이 angularjs 서비스간에 데이터를 공유합니까?

는 지금까지 (예를 들어) 내 각 모델에 대한 서비스가 있습니다

  • 클래스
  • 학생
  • 학년
  • 각 모델의 새로운 인스턴스를 생성 할

, 서버에서 ID를 검색 할 때까지 GUID가 주어진다.

문제는 동기화 서비스에 연결하려고 할 때 발생합니다. 이상적으로 클래스, 학생 및 학년 서비스는 동기화 서비스에 액세스해야하며 그 반대의 경우에도 새 객체를 동기화 서비스에 전달할 수 있어야합니다. 그러면 동기화 서비스는 서버에 접속할 때 해당 서비스에서 모델을 직접 업데이트 할 수 있습니다. 신분증. 내가 서비스를 서로에게 주입하려고하면 순환 종속성 오류가 발생합니다.

이러한 서비스간에 데이터를 공유하려면 어떻게해야합니까? 나는 각각의 개별 서비스에 걸쳐 모델을 동기화하기 위해 코드 복제를 피하고 싶다. (많은 수의 요청을 의미 할까?)

편집 :

가 여기에 내가 달성하고 싶은 무엇을 simplfied 예입니다 :

angular.module('App') 
    .service('sync', function sync(students) { 

     var objectsToBeSynced = []; 

     function resync() { 
      // $http() to process and manage the pending objects 
      /** 
      * If request returns success, write into students.students[newIdFromServer] = students.students[oldId]; 
      * then delete students.students[oldId]; 
      */ 
      setTimeout(resync, 10000); 
     } 

     this.addToSync = function(object) { 
      objectsToBeSynced.push(object); 
     } 
    } 

angular.module('App') 
    .service('students', function students(sync) { 
     var students = []; 
     this.students = students; 

     this.addStudent = function(student) { 
     sync.addToSync(student); 
     } 
    } 

답변

0

모든 서비스 sync 서비스에 따라 달라집니다. 따라서 다른 서비스에 동기화 서비스 종속성 만 추가하면됩니다.

모델 개체가 동일하면 id를 바꾸는 등의 동기화 서비스로 모델을 변경하면 다른 세 가지 서비스에서 이미 사용할 수 있습니다.

원하는 경우 업데이트 된 개체로 약속을 반환하는 서비스에 삽입 메서드를 구현할 수 있습니다.

업데이트 : 난 아직도 당신이 동기화 서비스가 작동 대상으로 한 sync 서비스 학생 서비스에 대한 참조를 추가 할 필요가 없습니다 느낌이 코드를 보면은 세 가지 중 하나에 의해 전송 된 것을 동일 서비스.

그래서

function resync() { 
      // $http() to process and manage the pending objects 
      /** 
      * If request returns success, and returns new id just update the existing object that is inside the objectsToBeSynced array, assuming you can correlate for which object you make request */ 
      setTimeout(resync, 10000); 
     } 
+0

내가 당신의 대답을 이해 모르겠어요 - 내가 '무엇을 간단한 예제와 함께 내 질문에 업데이트 나는하려고 애쓰다. 다른 모습을 보거나 다시 설명해 주시겠습니까? – Anonymous

0

이상적으로, 수업, 학생 및 등급 서비스는

내가 그 반대가 필요하지 않은 의심, 동기화 서비스와 그 반대에 액세스해야합니다. Class, Student 및 Grade 모두 서버에 동기화해야하는 sync 서비스에 데이터를 전달할 수 있어야합니다.

마치 $http과 비슷하지만 대기열이있는 것 같습니다. 보통 Angular $http은 모델 서비스에 대해 알 필요가 없으며 단지 데이터를 받아들이고 사용합니다. 귀하의 sync 서비스가 동일한 기능을 수행 할 수 있어야합니다.

사이드 바 : 이전에 비슷한 방식으로 너무 복잡한 큐를 구현했지만 그 후에 http interceptors을 발견했습니다. responseError으로 수행 할 수있는 작업을보고 지연이나 유사한 작업을 수행 한 후 자동으로 다시 시도 할 수 있습니다. 보통

0

이 약속은이 문제를 해결 $http에 의해 반환,하지만 난 당신이 새로운 객체의 배치와 ONE $http을하고있는 가정입니다, 그리고 여러 $http 요청, 각 개체에 대해 하나?

이 경우 가장 좋은 해결책은 각도 이벤트를 사용하는 것입니다. $emit 필요한 각 객체에 그 이벤트를 수신 돌아 오면, 각 newIdFromServer에 대한 sync에서 newId

.service('sync', function sync($rootScope) { // NOTE: inject $rootScope 

    var objectsToBeSynced = []; 

    function resync() { 
     // $http() to process and manage the pending objects 
     /* If request returns success, then for each new ID returned from 
     * server, do $rootScope.$emit('student.saveSucess', [oldId], [newIdFromServer]); 
     */ 
     setTimeout(resync, 10000); 
    } 

    this.addToSync = function(object) { 
     objectsToBeSynced.push(object); 
    } 
}) 

.service('students', function students($rootScope, sync) { // NOTE: inject $rootScope 
    var students = []; 
    this.students = students; 

    this.addStudent = function(student) { 
    sync.addToSync(student); 
    } 

    $rootScope.$on('student.saveSucess', function(event, oldId, newIdFromServer) { 
     students.students[newIdFromServer] = students.students[oldId]; 
     delete students.students[oldId]; 
    }); 
});