2016-12-28 2 views
0

私は、ユーザが検索を実行できるようにするIonicアプリケーションを持っています。検索結果をサービスに保存します。そのページが再び訪問され、その前にユーザーは検索結果をクリアして検索を再開できる結果ページにリダイレクトする必要があります。サービスへのイオニックパスアレイ

私の現在のコードは結果ページのデータを表示しますが、クリックをリセットしても何もしない場合、私のAPIから結果を$状態に直接渡していますので、サービスをバイパスしますが、 $ stateに渡すと、データもサービスに保存されます。

擬似コード***

私の注入されたコントローラの依存関係

.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メソッドを呼び出すのではなく、単に参照を渡しただけです。サービス名.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

良いキャッチ、私は答えを更新しました –