2017-12-23 2 views
0

서비스 (공장) 및 ngResource를 사용하여 실행 및 동작하는 RESTful 서비스에 요청을 보내고 선택적 결과를 보내는 코드를 작성하려고합니다. 비즈니스 로직을 기반으로합니다.컨트롤러에서 팩토리 서비스로 여러 인수 전달 REST 호출 및 데이터 반환 (선택 사항)

Passing multiple parameters from controller to factory in angularjs에 비슷한 내용의 질문이 있습니다. 나는 그것을 위해 일하는 데 어려움을 겪고 있고 또한 설명이 부족합니다.

나는 그것이 어떻게 작동하는지, 모범 사례를 이해하기 위해이 글을 쓰고 있으며, 장래에 나 자신과 같은 초보자에게 좋은 저장소가있다. 솔루션의 작성자에게 무례 위에서 제공되지하지만 아마도 아직 여기에 ;-)

을 달성 간다 적이 없다 I 영리의 수준 가정

내 컨트롤러

swof.controller('scheduleController', ['$scope', '$log', '$http', '$filter','moment', 'scheduleServicePeriod', function($scope, $log, $http, $filter, moment, scheduleServicePeriod) { 
 

 
    $scope.name = 'scheduleController::set default values and provide function to generate new schedule'; 
 
    $log.info('Controller: '+ $scope.name); 
 
    $scope.years = ["2017", "2018", "2019","2020","2021","2022"]; 
 
    $scope.selectedYear = "2017"; 
 
    $scope.selectedPeriod = Math.ceil(moment().format('w')) | 1 ; 
 
    $scope.genSchedule = function() 
 
    { 
 
    // when button is pressed function 'genSchedule' is called that either has default value for selectedYear and selectedPeriod or one user has selected. This bit works 
 
    scheduleServicePeriod.post({ s_year: $scope.selectedYear, s_period: $scope.selectedPeriod }).$promise.then(function(data){ 
 
     $scope.schedulegen = data; 
 
     $scope.genScheduleResponse=moment().format('h:mm:ss a') + " " + data.message; 
 
    }, function(data) { 
 
     $log.error();('Error: ' + data); 
 
    })}; 
 

 
}]);

내 공장 서비스

swof.factory('scheduleServicePeriod', function($resource) 
 
{ 
 
    var data = $resource('/api/schedules/period/:s_year/:s_period',{s_year: "@s_year",s_period: "@s_period" }, 
 
    { 
 
    'post': 
 
    { 
 
     method: 'POST', 
 
     params: {}, 
 
     isArray:true 
 
    } 
 
    }); 
 
    return data; 
 
});

  1. 값 (그렇지 않으면 기본 또는) 기능 genSchedule 도달을 어떻게됩니까 내 RESTful 웹 서비스

    router.route('/schedules/period/:schedule_year/:schedule_period') 
     
    
     
        .post(function(req,res) 
     
        { 
     
         // create record 
     
         var query = getEngineerIDs(); 
     
         var jsonMessage = "Success: Generated schedule for year = " + req.params.schedule_year + " and period starting week number = " + req.params.schedule_period ; 
     
    
     
         console.log(parseInt(req.params.schedule_period%2),parseInt(req.params.schedule_period)); 
     
    
     
         query.exec(function(err,records) 
     
         { 
     
         if(err) return console.log(err); 
     
         var results = SwfFn.populateCalendar(SwfFn.assignEngineers(records),+ 
     
             req.params.schedule_year,req.params.schedule_period); 
     
         if (results.length == 0 ) { 
     
          jsonMessage = "Failed: Start year/week in past"; 
     
         } 
     
         console.log(jsonMessage); 
     
         for (var count in results) 
     
         { 
     
          Schedule.findOneAndUpdate (
     
          { ymd: results[count].ymd, shift: results[count].shift }, 
     
          results[count], 
     
          {upsert: true, new: true, runValidators: true}, 
     
          function (err,res) { if (err) res.send(err); } 
     
         ); 
     
         } 
     
         res.json({message: jsonMessage }); 
     
         }); 
     
    
     
        })

    .

  2. RESTful 서비스에 도달하는 값은 '정의되지 않음' '정의되지 않음'입니다.
  3. 문제는 공장 서비스와 관련이 있습니다.
  4. 작동하지 않는 유사한 솔루션이 있습니다 (위)
  5. 컨트롤러에서 서비스로 JSON 하나만 보내야한다고 알고 있지만 공장 측에서 처리하는 방법을 잘 모르겠습니다. .
  6. 나는 (아직) 검색 부분을 사용할 수 없지만 지금은 기다릴 수 있습니다.

감사합니다.

+0

https://docs.angularjs.org/api/ngResource/service/$resource에서 찾을 수 있습니다. 여전히 그것을 읽지 만 조금 다른 방식으로 (원하는 방식으로 코드가 구조화되어) 원하는 것을 주소라고 생각합니다. – GerM

답변

0

실제로 작동했습니다! 내가 잘못하고있는 것은 디버깅을 위해 console.log를 사용할 때와 UI에 응답 메시지를 표시 할 때 잘못된 값을 출력하는 것이었다.

내가 POST/API/일정/기간의 라인을 따라 API 호출을 만들고 싶어 요약하면 // 호출은 계산을 수행하고 I가 최종 사용자를 표시 할 응답을 다시 전송

화면.

다음은 여전히 ​​개선 될 수있는 작업 코드이지만 기본적인 사용 사례에 대해서는 합리적으로 좋은 예입니다. 예제를 따르는 것이 매개 변수를 보내는 구문은 논리적 인 결론입니다.

컨트롤러

swof.controller('scheduleController', ['$scope', '$log', '$http', '$filter','moment', 'scheduleServicePeriod', function($scope, $log, $http, $filter, moment, scheduleServicePeriod) { 
 

 
    $scope.name = 'scheduleController::set default values and provide function to generate new schedule'; 
 
    $log.info('Controller: '+ $scope.name); 
 
    $scope.years = ["2017", "2018", "2019","2020","2021","2022"]; 
 
    $scope.selectedYear = "2017"; 
 
    $scope.selectedPeriod = Math.ceil(moment().format('w')) | 1 ; 
 

 
    $scope.genSchedule = function() 
 
    { 
 
    scheduleServicePeriod.post({ s_year: $scope.selectedYear, s_period: $scope.selectedPeriod }).$promise.then(function(data){ 
 
     $scope.schedulegen = data; 
 
     $scope.genScheduleResponse=moment().format('h:mm:ss a') + " " + data.message; 
 
    }, function(data) { 
 
     $log.error();('Error: ' + data); 
 
    })}; 
 

 
}]);

서비스 공장

swof.factory('scheduleServicePeriod', function($resource) 
 
{ 
 
    var data = $resource('/api/schedules/period/:s_year/:s_period',{s_year: "@s_year",s_period: "@s_period" }, 
 
    { 
 
    'post': 
 
    { 
 
     method: 'POST' 
 
    } 
 
    }); 
 
    return data; 
 
});

편안하고 호출

router.route('/schedules/period/:schedule_year/:schedule_period') 
 

 
    .post(function(req,res) 
 
    { 
 
     // create record 
 
     var query = getEngineerIDs(); 
 
     var jsonMessage = "Success: Generated schedule for year/period [" + req.params.schedule_year + "/" + req.params.schedule_period +"]" ; 
 

 
     query.exec(function(err,records) 
 
     { 
 
     if(err) return console.log(err); 
 
     var results = SwfFn.populateCalendar(SwfFn.assignEngineers(records),+ 
 
         req.params.schedule_year,req.params.schedule_period); 
 
     if (results.length == 0 ) { 
 
      jsonMessage = "Failed: Start year/week in past"; 
 
     } 
 
     for (var count in results) 
 
     { 
 
      // Write record to Mongo using upsert; if records for future date already 
 
      // here then overwrite them otherwise insert. This is ok since the period 
 
      // is in the future 
 
      Schedule.findOneAndUpdate (
 
      { ymd: results[count].ymd, shift: results[count].shift }, 
 
      results[count], 
 
      {upsert: true, new: true, runValidators: true}, 
 
      function (err,res) { if (err) res.send(err); } 
 
     ); 
 
     } 
 
     res.json({message: jsonMessage }); 
 
     console.log(jsonMessage); 
 
     });

웹 페이지

<div> 
 
    <h3>Generate</h3> 
 
<h4>Generate schedule for future periods</h4> 
 
<p>Select year and week start period to generate a schedule for future support slots. Previously generated values will be lost. You cannot generate a scheule for periods in the past or the current period we are in.</p> 
 
<form name="scheduleGenerate"> 
 
    <select ng-model="selectedYear" ng-options="x for x in years"></select> 
 
    Start Week (1-51 [odd numbers]): 
 
    <input ng-model="selectedPeriod" type="number" name="genperiod" placeholder="1" min="1" max="51" step="2" onkeydown="return false"> 
 
    <input type="button" class="click" id="click" value="Generate" ng-click="genSchedule()"> 
 
    <label class="control-label"> {{ genScheduleResponse }}</label> 
 
</form> 
 
</div>
,

누군가가 유용하다고 생각합니다.

+0

내 코드는 https://github.com/gmanroney/supportscheduler에서 확인할 수 있습니다. 나는이 '제품'아이디어를 html5, css3 및 일부 웹 프레임 워크 외에도 nodejs, angularjs를 배우는 방법으로 사용하고 있습니다. 자유롭게 느껴보십시오. 나는 그것에 접근하기를 원하는 누구에게나 의미 있고 유용하게하기 위해 논평하려고 노력한다 ... – GerM

관련 문제