6

기본 CRUD 호출을 수행하는 API는 물론 데이터베이스 모델의 준비 영역 역할을 수행 할 팩토리를 구축하려고합니다. 서비스 또는 팩토리에 데이터를 저장하여 데이터에 액세스 할 수 있고 API 메서드를 유지하여 컨트롤러에서 이와 같은 작업을 수행 할 수 있기를 원합니다.

$scope.folders = Folders.data(); // for a factory 
$scope.folders = Folders.data; // for a Service 

Folders.create({name: "My Stuff, $oid: { 5fwewe033333 }, user_id: CurrentUser.id"}); 

현재 컨트롤러에서 이와 같은 폴더 팩터 리를 사용하고 있습니다.

Folders.foldersData().success(function(data, status) { 
    $scope.folder = data; 
}) 
.error(function(data,status) { 
    Flash.warning("There was a problem fetching your data"); 
}); 

는 난 그냥 컨트롤러에서 해결 약속을 할 수 있습니다 알고 있지만 내가 맡은 프로젝트의 크기에, 나는 밖으로가 갖는, 서비스의 폴더 모델에 액세스 할 수있는 아이디어를 좋아한다 변경을 할 때마다 데이터를 동기화하기 위해 서버 호출을합니다.

angular.module('cmsApp') 
    .factory('Folders', function($http, $q){ 

    var folders = {}; 
    var messageWarn = "Upload Retrival Failed."; 


    return { 
     get: function(){ 
     var defered = $q.defer(); 

     $http.get('/folders').success(function (data, status) { 
      defered.resolve(data); 
     }) 
     .error(function (data, status) { 
      defered.reject(); 
      Flash.warning(message_warn); 
     }); 
     defered.promise.then(function (promise) 
      folders = promise; 
     }); 
     }, 
     data: function(){ 
     return folders; 
    }, 
    }    
}); 

내 문제는 Folders.get()을 호출 한 후에도 폴더 개체를 유지할 수 없다는 것입니다. Folders.data()를 빈 객체로 호출하면 항상 돌아옵니다.

매번 서버를 때리는 데 의존하지 않는 폴더 모델의 최신 표현으로이 데이터를 공장에 보관하는 방법이 있습니까?

Rails 4 API에서 각도 1.2.3을 실행 중입니다.

+0

네, 예를 들어 드리겠습니다. 당신이 혼동하는 주된 이유는 공장이 서비스를 만들고 나서 완료된다는 것입니다. 말하면 공장에 액세스 할 수 없습니다. 오직 서비스. – m59

답변

10

약속을 서비스의 개체로 저장할 수 있습니다. 위에서 설명한 확장 데모를 실행하여 위의 예제와 같이 실행하면 http://plnkr.co/edit/2HqQAiD33myyfVP4DWg3?p=preview

과 같이 http 호출이 한 번만 수행되지만 이번에는 약속이 서비스 개체의 폴더 항목에 추가됩니다.


app.factory('myService', function($http, $q) { 

    return { 

    myObject: '', 

    get: function() { 
     // Create the deffered object 
     var deferred = $q.defer(); 

     if(!this.myObject) { 
     // Request has not been made, so make it 
     $http.get('my-file.json').then(function(resp) { 
      console.log('Making the call!'); 
      deferred.resolve(resp.data); 
     }); 
     // Add the promise to myObject 
     this.myObject = deferred.promise; 
     } 
     // Return the myObject stored on the service 
     return this.myObject; 

    } 

    }; 

}); 
+0

요청 코드를 재사용 할 수 있지만 컨트롤러 당 요청을 한 번만 수행 할 수있는보다 유용한 접근법을 보여주는 plunkr을 추가했습니다. http://plnkr.co/edit/2HqQAiD33myyfVP4DWg3?p=preview 참조 개인적으로, 나는 makeRequest 객체를 HTTP GET, POST, DELETE 등과 같은 유연성을 갖춘 자체 서비스로 캡슐화하고 그 서비스를 다른 모든 서비스에 주입한다. 내 API를 때릴 서비스. – aaronroberson

+0

좋은 대답, 더 많은 칭찬을받을 가치가있다 – KeepCalmAndCarryOn

+0

이것이 내 대답과 어떻게 다른지 나는 알지 못한다. 동일한 개념을 제시 할 수있는 방법은 많습니다. 또한,'$ http' 호출에 의해 반환 된 약속을 사용하기보다는 수동으로 약속을 생성함으로써 promise 방지 패턴을 사용하고 있습니다. – m59

2

이 예에서 본질적으로 서비스는 입니다. 처음 서비스가 삽입되면 약속이 만들어지고 통화가 종료됩니다. 서비스는 실제로 그 데이터의 약속이지만, 콜이 다시 돌아 오면 약속이 데이터로 해결됩니다. 따라서 서비스가 주입 된 두 번째, 세 번째 등의 시간에 호출이 다시 수행되지 않습니다. 공장에서 이미 작업을 완료하고 서비스를 반환했습니다 (이 예에서는 약속).

Live demo (click).

var app = angular.module('myApp', []); 

app.controller('myCtrl', function($scope, myService) { 
    myService.then(function(data) { 
    $scope.data = data 
    }) 
}); 

app.factory('myService', function($http, $q) { 
    //this runs the first time the service is injected 
    //this creates the service 

    var promise = $http.get('my-file.json').then(function(resp) { 
    return resp.data; 
    }); 

    return promise; 

}); 

는 여기에 내가 두 번 데이터를 사용하는에 expanded demo입니다. 콘솔 로그를 주목하십시오 - 호출은 오직 한번만 만들어집니다. 이 데모에서는 약속을 반환하는 get 메서드가있는 객체로 서비스를 만들었습니다. 이 기술을 구현할 수있는 다른 방법을 보여 주기만했습니다.

app.factory('myService', function($http, $q) { 

    console.log('Making the call!'); 
    var promise = $http.get('my-file.json').then(function(resp) { 
    return resp.data; 
    }); 

    var myService = { 
    get: function() { 
     return promise; 
    } 
    }; 

    return myService; 
}); 
+0

Thanks @ m59,하지만 서비스에서 해결 된 약속을 저장하고 서버에 다시 접속하지 않고도 데이터를 조작하고 싶다면 어떻게해야합니까? 그래서 Folders.data와 같은 전화를 할 수 있습니다. [1] = {folder_name : "New Folder"} – armynante

+0

나는 서비스에서 해결 된 약속을 저장하려고하는 동일한 질문을 가지고 있습니다. – allencoded

+0

@allencoded 어떤 문제인지 잘 모릅니다. 가지고있어. 나는 이것을 할 수 있고 잘 작동하는 두 가지 방법을 시연했다. – m59

관련 문제