2016-12-28 1 views
0

사용자가 검색을 수행 할 수있게 해주는 이오니아 응용 프로그램이 있습니다. 검색 결과를 서비스에 저장하고 해당 페이지를 다시 방문하면 해당 서비스의 결과가 사용자는 검색 결과를 지우고 검색을 다시 시작할 수있는 결과 페이지로 리디렉션되어야합니다.이오 닉 패스 어레이 서비스

현재 코드는 결과 페이지에 데이터를 표시하지만 클릭 재설정을 클릭해도 아무런 변화가 없는데 내 API에서 결과를 $ 상태로 직접 전달하므로 서비스는 생략하지만 그대로 사용합니다. $ 상태로 전달하면서 데이터를 서비스에 저장합니다.

의사 코드 ***

내 주입 컨트롤러 종속성

.controller('SearchCtrl', function($scope, $http, $state, $ionicLoading, $ionicHistory, serviceName) { 

if(serviceName.searchHistory){ 
     $state.go('app.searchResults', {items: {items: serviceName.getSearch}}); 
    } else { 

$scope.beginSearch = function() { 
      $http.post('https://domain/api/v1/search?token=' + localStorage.getItem("token"),$scope.search).then(function(successResponse){ 

      $scope.return = successResponse; 
      $scope.searchResponse = $scope.return.data.data[0]; 

      serviceName.setSearch($scope.searchResponse.items); 

      $state.go('app.searchResults', {items: {items: $scope.searchResponse.items}}); 

      }); 
     } 
} 
}) 

내 서비스

angular.module('starter.services', []) 

.factory('serviceName', function() { 

    var searchHistory = []; 

    return { 

    getSearch: function(){ 
     return searchHistory; 
    }, 
    setSearch: function(data){ 
     var searchHistory = data; 
    }, 
    clearSearch: function(){ 
     searchHistory = []; 
    } 

    } 

}) 

내 결과 컨트롤러

.controller('resultsCtrl', function($scope, $http, $state, $ionicLoading, $stateParams, $ionicPopup, serviceName) { 

    $scope.item = $stateParams.items.items; 
    $scope.data = {}; 

    $scope.resetFilter = function(){ 

    serviceName.clearSearch(); 
    $state.go('app.beginSearch'); 

    } 

}) 
+0

이 실제 코드 또는 의사 코드입니까? 실제로 getSearch 메소드를 호출하지 않았고 방금 참조를 전달했습니다. 해야합니다 : serviceName.getSearch(). –

+0

사과 @CoryGlanton 내가 가지고있는 것을 기본 설정으로 보여주는 코드를 간소화하고 잘랐다. –

+0

죄송합니다 - 너무 빨리 입력했습니다. 위의 편집을 참조하십시오. –

답변

2

배열을 $ stateParameters로 사용하면 쿼리 문자열 매개 변수처럼 작동합니다.

'app.searchResults' 상태로 사용자를 리디렉션 :이 하나가 될 수 달성하고자하는 것에 대해

그리고 대안.

.controller('SearchCtrl', function($scope, $http, $state, $ionicLoading, $ionicHistory, serviceName) { 

if(serviceName.searchHistory){ 
     $state.go('app.searchResults'); 
    } else { 

$scope.beginSearch = function() { 
      $http.post('https://domain/api/v1/search?token=' + localStorage.getItem("token"),$scope.search).then(function(successResponse){ 

      $scope.return = successResponse; 
      $scope.searchResponse = $scope.return.data.data[0]; 

      serviceName.setSearch($scope.searchResponse.items); 

      $state.go('app.searchResults', {items: {items: $scope.searchResponse.items}}); 

      }); 
     } 
} 
}) 

그리고 컨트롤러에 사용자 지정 서비스의 결과를로드하십시오.

.controller('resultsCtrl', function($scope, $http, $state, $ionicLoading, $stateParams, $ionicPopup, serviceName) { 

     $scope.item = serviceName.getSearch(); 
     $scope.data = {}; 

     $scope.resetFilter = function(){ 

     serviceName.clearSearch(); 
     $state.go('app.beginSearch'); 

     } 

    }) 

UPDATE : 서비스에서

당신이 당신의 업데이트 방법 내부 var를 사용하고, 무엇을 당신이 searchHistory의 새로운 기준을 만드는 것을 의미한다. 참조를 유지하려면 var을 제거해야합니다.

angular.module('starter.services', []) 

.factory('serviceName', function() { 

    var searchHistory = []; 

    return { 

    getSearch: function(){ 
     return searchHistory; 
    }, 
    setSearch: function(data){ 
     searchHistory = data; 
    }, 
    clearSearch: function(){ 
     searchHistory = []; 
    } 

    } 

}) 
+1

이것은 맞습니다. 또한 새 배열에 대한 참조를 재설정하기 때문에 서비스가 목록을 업데이트하지 않습니다. –

+0

나는 당신이 가진 방식대로 참조를 깨는 것에 대한 예를 만들었습니다. Plnkr : http://plnkr.co/edit/EgU9XRJtMg1EZPz5pm6R?p=info –

+0

좋은 캐치, 대답을 업데이트했습니다. –