2016-02-09 2 views
0

Я пытаюсь обмениваться данными через службу, которая использует функцию $ HTTP между контроллерами. Я пытаюсь передать возвращаемые данные в SUCCESS на другой контроллер. Что-то не так, я думаю, что в службе данные не попадают во второй контроллер. ниже мой код может кто-то взглянуть на него и сказать мне, что я делаю неправильно, указывая мне в правильном направлении, что делать.Обмен данными между контроллерами в AngularJS и IONIC

services.js

.factory('userService', function ($http) { 
    var url = "url.php"; 
    var headers = { 
     'Content-Type' : 'application/x-www-form-urlencoded; charset-UTF-8' 
    }; 
    var params = ""; 
    return { 

     getUsers : function (entry, searchTypReturn) { 
      params = { 
       entry : entry, 
       type : searchTypReturn, 
       mySecretCode : 'e8a53543fab6f5e' 
      }; 

      return $http({ 
       method : 'POST', 
       url : 'https://servicemobile.mlgw.org/mobile/phone/phone_json.php', 
       headers : { 
        'Content-Type' : 'application/x-www-form-urlencoded; charset-UTF-8' 
       }, 
       transformRequest : function (obj) { 
        var str = []; 
        for (var p in obj) 
         str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p])); 
        return str.join("&"); 
       }, 
       data : params 
      }) 
      .success(function (data, status, headers, config) { 

       return data; 

      }); 

     } 
    } 
}) 

controller.js

.controller('phoneController', function ($scope, md5, $http, userService, $ionicLoading, $location, $ionicPopup) { 

    userService.getUsers(form.entryText, searchTypReturn).success(function (data, status, headers, config) { 
     $ionicLoading.hide(); 
     $scope.name = data.PlaceDetailsResponse.results[0].first_name; 
     if ($scope.name == 0) { 
      $scope.showAlert(); 

     } else { 

      $location.path('phoneView'); 
      $ionicLoading.hide(); 
     } 
    }).error(function (data, status, headers, config) { 
     $scope.showAlert(); 
     $ionicLoading.hide(); 
    }) 

}); 

.controller('phoneViewController', function ($scope, userService) { 
    $scope.input = userService; 
    console.log('This is from phoneView', $scope.input); 
}); 
+0

Вам нужно передать полученные данные от API в контроллер на другой контроллер? –

+0

Вы не можете вернуться с успехом, вернуться туда нечем. Используйте 'then()' для возврата данных из объекта перспективы – charlietfl

+0

@NasserGhiasi да, это то, что я пытаюсь сделать. – Dwill

ответ

0

вы можете хранить полученные данные от API в $ rootScope или глобальной переменной или вы можете хранить данные на заводе.

пример использования $ rootScope

angularApp.controller('phoneController', function($scope, md5, $http, userService, $rootScope, $ionicLoading, $location, $ionicPopup) { 

$rootScope.data = userService.getUsers(form.entryText,searchTypReturn).success(function(data, status, headers, config) { 
    $ionicLoading.hide(); 
    $scope.name = data.PlaceDetailsResponse.results[0].first_name; 
    if ($scope.name == 0) { 
      $scope.showAlert(); 

    } else { 

     $location.path('phoneView'); 
     $ionicLoading.hide(); 
    } 
}).error(function(data, status, headers, config) { 
    $scope.showAlert(); 
    $ionicLoading.hide(); 
}) 

} 
}); 

.controller('phoneViewController', function($scope,$rootScope) { 
$scope.input = $rootScope.data; 
console.log('This is from phoneView',$scope.input); 
}) 

с использованием данных завода (рекомендуется) ответ

angularApp.factory('appDataStorage', function() { 
var data_store = []; 

return { 
    get: function (key) { 
     //You could also return specific attribute of the form data instead 
     //of the entire data 
     if (typeof data_store[key] == 'undefined' || data_store[key].length == 0) { 
      return []; 
     } else { 
      return data_store[key]; 
     } 

    }, 
    set: function (key, data) { 
     //You could also set specific attribute of the form data instead 
     if (data_store[key] = data) { 
      return true; 
     } 
    }, 
    unset: function (key) { 
     //To be called when the data stored needs to be discarded 
     data_store[key] = {}; 
    }, 
    isSet: function (key) { 
     if (typeof data_store[key] == 'undefined' || data_store[key].length == 0) { 
      return false; 
     }else { 
      return true; 
     } 
    } 
}; 
}); 

    angularApp.controller('phoneController', function($scope, md5, $http, userService, $rootScope, $ionicLoading, $location, $ionicPopup , appDataStorage) { 

var data = userService.getUsers(form.entryText,searchTypReturn).success(function(data, status, headers, config) { 
    $ionicLoading.hide(); 
    $scope.name = data.PlaceDetailsResponse.results[0].first_name; 
    if ($scope.name == 0) { 
      $scope.showAlert(); 

    } else { 

     $location.path('phoneView'); 
     $ionicLoading.hide(); 
    } 
}).error(function(data, status, headers, config) { 
    $scope.showAlert(); 
    $ionicLoading.hide(); 
}); 

appDataStorage.set('key1',data); 

} 
}); 

angularApp.controller('phoneViewController', function($scope,$rootScope,appDataStorage) { 
$scope.input = appDataStorage.get('key1'); 
console.log('This is from phoneView',$scope.input); 
}) 
1

Насера ​​является правильным. Существуют и другие способы отслеживания вещей в памяти, если это только сеанс.

Например, есть http://lokijs.org/, который также утверждает, что данные сохраняются между сеансами, потому что они также записываются в файл. И он заменяет SQLite.

Связь между контроллерами и директивами, которые получают данные, отображаемые из сферы действия директив, слабо связаны.

Если в области нет значений для отображения, например {{valuetobedisplayedfromcontroller}}, ваш html станет напуганным.

Есть 2 варианта исправить это. Либо используйте ng-if условные обозначения в директивах html, либо инкапсулируйте весь контроллер в команду if, которая проверяет глобальную переменную, чтобы увидеть, загружены ли данные и показать экран загрузки, и предотвратить ошибку ввода и возврата пользователя с тайм-аутом.

Я очень хочу узнать, есть ли другие/лучшие решения.

Смежные вопросы