2016-12-28 34 views
0

我有一个Ionic应用程序,它允许用户执行搜索,我将搜索结果保存到服务中,并且如果该页面被再次访问,并且服务中存在结果用户应该被重定向到用户可以单击以清除结果重新搜索的结果页面。离子传递阵列服务

我目前的代码显示结果页面上的数据,但点击重置单击时,它什么都不做,我直接从我的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

良好的捕获,我更新了答案 –