2013-09-02 2 views
2

지난 며칠 동안 REST 서비스를 호출하고 응답, 오류, 콜백 등을 추적하기 위해 노력하고 있습니다. 그러나 제한된 Angular에 대한 이해는 내가 그것을 이해할 수없는 것처럼 보인다. 다음은 지금까지 얻은 나의 문제와 이해입니다.

"project_id"만 반환하는 $ update() 서비스를 사용하고 있습니다. 이 서버는 전체 데이터를 다시 반환하지 않습니다. 다음은 몇 줄의 코드를 공유하는 것입니다.

//create Project factory 
app.factory('Project', function ($resource) { 
    return $resource('/api/projects/:projectid', 
      {projectid:'@id'}, 
      {update: {method:'PUT', isArray:false}}  
    ); 

}); 

다음은 프로젝트를 업데이트/생성하는 데 사용하는 지시문입니다.

//save project 
      scope.saveProject = function (project) { 
       //update modified by field 
       project.modifiedby = scope.user._id; 
       //change to view mode 
       scope.projectView = 1; 
       //call server to save the data     
       if (project._id == undefined || project._id == "") { 

        //Call server to create new and update projectID 
        project._id = project.$save()._id; 
       } 
       else { 
        //Call server to update the project data 
        project.$update({ projectid: project._id }); 
       } 


      }; 

다음은 save() 및 update()에 대한 서비스 응답입니다.

{"_id":"52223481e4b0c4d1a050c25e"} 

문제점은 다음과 같습니다. "project"객체 값은 project_id 만 갖는 서버가 반환 한 새로운 응답으로 대체되고 다른 필드는 대체됩니다.

$ resource에 대한 자세한 설명서를 살펴 보았지만 이해할 수는 없습니다. 오류, 응답, 콜백을 감지하는 코드를 작성하려면 여기에서 지침을 얻는 것이 좋습니다. 당신은 하나 원의 객체를 대체 할 수

답변

0

jvandemo 및 BoxerBucks의 제안에 따라; 필자는 원본 데이터의 복사본으로 콜백 메서드를 전달하여 저장/업데이트를 위해 다음과 같은 접근 방식을 사용했습니다. 그러나 여전히 오류/성공 상태를 처리하는 중앙 접근 방식을 찾고 있습니다. 제발 제안 해주세요.

//save project metadta 
      scope.saveProjectMetadta = function (project) { 

       //update modified by field 
       project.modifiedby = scope.user._id; 
       //change to view mode 
       scope.projectView = 1; 
       //keep original data to pass into callback 
       var originalProjectObject = angular.copy(project); 
       //call server to save the data     
       if (project._id == undefined || project._id == "") {      
        //Call server to create new and update projectID 
        project.$save(originalProjectObject, function (projectResponse) { 
         originalProjectObject._id = projectResponse._id; 
         //update scope 
         scope.project = originalProjectObject; 
         //invoke method to update controller project object state 
         scope.updateProjectScope(scope.project); 
        }); 

       } 
       else { 
         //Call server to update the project data 
         project.$update({ projectid: project._id }, function (projectResponse) { 

         originalProjectObject._id = projectResponse._id; 
         //update scope 
         scope.project = originalProjectObject; 
         //invoke method to update controller project object state 
         scope.updateProjectScope(scope.project); 

        },originalProjectObject); 

       } 
      }; 
0

은 다음과 같이 당신의 성공 콜백에서 서버에서 리턴 : 서버 응답 자마자 서버에 의해 반환 된 하나 원의 객체를 대체 할

 //save project 
     scope.saveProject = function (project) { 

      //update modified by field 
      project.modifiedby = scope.user._id; 

      //change to view mode 
      scope.projectView = 1; 

      //call server to save the data     
      if (project._id == undefined || project._id == "") { 

       //Call server to create new and update projectID 
       project.$save(function(updatedProject, headers){ 

        // Replace project by project returned by server 
        project = updatedProject; 
       }); 
      } 
      else { 
       //Call server to update the project data 
       project.$update(function(updatedProject, headers){ 

        // Replace project by project returned by server 
        project = updatedProject; 
       }); 
      } 

     }; 

수신됩니다. 콜백이 $save$update 방법에 대해 동일한 경우

, 당신은 더 이런 식으로 코드를 단순화 할 수 있습니다

 //save project 
     scope.saveProject = function (project) { 

      //update modified by field 
      project.modifiedby = scope.user._id; 

      //change to view mode 
      scope.projectView = 1; 

      var action = (angular.isDefined(project._id)) ? '$update' : '$save'; 

      //call server to save the data     
      project[action](function(updatedProject, headers){ 

       // Replace project by project returned by server 
       project = updatedProject; 
      }); 

     }; 

희망을!

+0

나는 이전에 언급했듯이 효과가 없을 것이라고 생각합니다. 서버가 완전한 프로젝트 객체를 반환하지 않습니다. 그 서버 대신에 "project_id"만 반환합니다 – joy

+0

저는이 접근법을 시도했지만 작동하지 않았습니다 ..... 다른 접근법을 공유 할 수 있다면 좋을 것입니다. 나는 정말로 여기에서 붙어있다. – joy

+0

REST 표준을 따르는 경우 서버는 생성되거나 업데이트 된 객체로 응답해야합니다. 이것은 서버가 데이터를 정규화 할 수 있기 때문입니다. 케이싱 또는 포맷팅을 조정하면 응답은 정규화 된 데이터를 반영합니다. 서버가 반환하지 않는 한 사용자 입력이 유효하다고 안전하게 가정 할 수 없습니다. 따라서 본질적으로 서버 측을 제어 할 수있는 경우 업데이트 된 객체를 적절한 HTTP 상태 코드를 사용하여 응답 본문 (json)으로 반환하는 것이 좋습니다. – jvandemo

관련 문제