2015-12-24 3 views
0

Во-первых, извините за мой английский; Я не носитель языка.

Во-вторых, я создаю приложение для Android с использованием фреймворка Ionic, и я использую Django в качестве REST API.

У меня проблемы с фабрикой: статус HTTP из запроса в Django равен 200, и база данных регистрирует изменение, но в приложении статус HTTP равен 0. Это происходит только на этой фабрике, которая содержит два запроса POST. Другие запросы POST, сделанные на других заводах, работают нормально.

Чтобы проверить приложение, я использую Google Chrome (с командой --disable-web-security), Ionic версии 1.5.0, версия Django 1.8.2, версия Cordova 5.0 (я не мог найти, какую версию AngularJS я использую). У меня такие же проблемы на нескольких мобильных устройствах.

Вот 3 контроллеры, которые вызывают проблемы:

.controller('PlanesCtrl', function($scope, $ionicModal, $ionicPopup,$location, Planes, $window) { 

$scope.planes = JSON.parse($window.localStorage['planes']); 
$scope.usuario = JSON.parse($window.localStorage['user']); 
     var usuario_id = { 
      codusuario: $scope.usuario["codusuario"] 
     }; 
$scope.mascotaEscogida = JSON.parse($window.localStorage['mascotaEscogida']); 
     var especie_id = { 
      codespecie: $scope.mascotaEscogida.codespecie 
     }; 
     var mascota_id = { 
      codmascota: $scope.mascotaEscogida.id 
     }; 
     var data = { 
      codespecie: $scope.mascotaEscogida.codespecie, 
      codmascota: $scope.mascotaEscogida.id 
     } 

$scope.ver_plan = function(plan){ 
    Planes.selectChosenPlan(plan.id); 
    if (plan.suscrito == 0){ 
     $location.path("/app/planes/" + plan.id); 
    } 
    else{ 
     $location.path("/app/entrenar/" + plan.id); 
    } 
}; 
}) 

.controller('PlanCtrl', function($scope, $ionicModal,$location, $ionicPopup, $window, Planes) { 
$scope.mascotaEscogida = JSON.parse($window.localStorage['mascotaEscogida']); 

var mascota_id = { 
      codmascota: $scope.mascotaEscogida.codmascota 
     }; 
$scope.plan = JSON.parse($window.localStorage['planActual']); 

var data = { 
      codplan: $scope.plan.id, 
      codespecie: $scope.mascotaEscogida.codespecie, 
      codmascota: $scope.mascotaEscogida.id 
     }; 

$scope.suscribir = function(){ 
    var data = { 
      codplan: $scope.plan.id, 
      codespecie: $scope.mascotaEscogida.codespecie, 
      codmascota: $scope.mascotaEscogida.id 
     }; 
console.log($scope.plan.id); 
console.log($scope.mascotaEscogida.codespecie); 
console.log($scope.mascotaEscogida.id); 
Planes.suscribir(data, function() { 
     alert("Su mascota ha sido suscrita al plan con éxito"); 
     } , function() { 
     } , function() { 
      console.log("No funciona suscribir en funcion suscribir, PlanCtrl"); 
     }); 
Planes.buscar(data, function() { 
     } , function() { 
     } , function() { 
      console.log("No funciona buscar en funcion suscribir, PlanCtrl"); 
     }); 
$location.path("/app/pet/" + mascota_id); 
$window.location.reload(true); 
}; 
}) 

.controller('PetCtrl', function($scope, $stateParams, $filter, $location, Mascota, Planes, $window, $ionicModal) { 

$scope.mascotaEscogida = JSON.parse($window.localStorage['mascotaEscogida']); 
$scope.usuario_logged = JSON.parse($window.localStorage['user_data']); 
$scope.usuario_info = JSON.parse($window.localStorage['user']); 
     var data = { 
      codespecie: $scope.mascotaEscogida.codespecie, 
      codmascota: $scope.mascotaEscogida.id 
     } 

$scope.ver_entrenamientos = function(mascota){ 
Planes.buscar(data, function() { 
     alert("Planes encontrados con exito"); 
     } , function() { 
      alert("La mascotas no posee especie registrada (esto es muy extraño)"); 
     } , function() { 
      console.log("No funciona buscar en ver_entrenamientos, PetCtrl"); 
     }); 
$location.path("/app/planes"); 
$window.location.reload(true); 
}; 

if($scope.usuario_logged === false) { 
    $location.path('/login'); 
} 

else { 

    $scope.test = function() { 
    fecha_hora = $filter('date')(new Date(), 'yyyy-MM-dd HH:mm:ss', '-0300'); 
    var info = { 
     fecha: fecha_hora, 
     codmascota: $scope.mascotaEscogida.id, 
     codusuario: $scope.usuario_info.codusuario 
    } 
    Mascota.alimentar(info, function() { 
    alert("La mascota ha sido alimentada con exito :)"); 
    } , function() { 
    alert("Lo sentimos, algo ha ocurrido y no podemos registrar la alimentación"); 
    } , function() { 
    alert("Verifica la conexión a internet"); 
    }); 
} 
} 

}) 

А вот завод:

.factory("Planes", function($http, $window){ 
    var url = "http://localhost:8000/plan/"; 

    var currentPlanes = function(data){ 
     $window.localStorage['planes'] = JSON.stringify(data);  
    }; 

    return { 

     selectChosenPlan: function(id) { 
      var arregloPlanes = JSON.parse($window.localStorage['planes']); 
      for (var i = 0; i <= arregloPlanes.length - 1; i++) { 
       if (parseInt(arregloPlanes[i].id) == id) { 
        $window.localStorage['planActual'] = JSON.stringify(arregloPlanes[i]); 
       } 
      } 
     }, 

     buscar: function(inf, successFunction, errorFunction, connectionError) { 
      $http({ 
       method: 'POST', 
       url: url + 'planes/', 
       headers: {'Content-Type': 'application/json'}, 
       data: JSON.stringify(inf), 
       timeout: 20000 
      }).then(function successCallback(response) { 
       if (response.data.length > 0) { 
        console.log("buscar" + response.data[0]); 
        currentPlanes(response.data); 
        successFunction(); 
       } 
       else{ 
        currentPlanes(response.data); 
        errorFunction(); 
       } 
      }, function errorCallback(response) { 
       connectionError(); 
      }); 
     }, 


     suscribir: function(inf, successFunction, errorFunction, connectionError) { 
      $http({ 
       method: 'POST', 
       url: url + 'suscribir/', 
       headers: {'Content-Type': 'application/json'}, 
       data: JSON.stringify(inf), 
       timeout: 20000 
      }).then(function successCallback(response) { 
       if (response.data.length > 0) { 
        console.log("suscribir" + response.data[0]); 
        currentPlanes(response.data); 
        successFunction(); 
       } 
       else{ 
        currentPlanes(response.data); 
        errorFunction(); 
       } 
      }, function errorCallback(response) { 
       connectionError(); 
      }); 
     } 
    };  
}) 

Я сделал некоторые исследования в Интернете, но все решения я имею нашел точку в CORS. Если это была проблема, другая фабрика тоже не работала, поэтому я не думаю, что это проблема. Некоторые другие ответы говорят о том, что проблема может быть в HTML, на кнопке, которая вызывает 'ver_plan' или 'ver_entrenamiento', но оба они установлены с type="button", поэтому подача тоже не была проблемой. Ошибка происходит случайным образом, и я не могу найти проблему в потоке событий. Иногда я даже получаю сообщение от 'broken pipe' от Django, но это также случается случайным образом.

Я знаю, что ответ JSON действителен и имеет правильный формат; У меня нет идей, и мне нужно решить эти проблемы.

Редактировать: Кроме того, строка console.log("No funciona buscar en funcion suscribir, PlanCtrl"); не появляется в консоли при возникновении проблемы.

ответ

0

Я нашел ответ пару недель назад. Проблема была $window.location.reload(true); и $location.path();

не обязательно линия $window.location.reload(true); если $location.path(); находится внутри фабрики вызова. Например:

Planes.buscar(data, function() { 
    $location.path("/app/pet/" + mascota_id); 
    } , function() { 
    } , function() { 
     console.log("No funciona buscar en funcion suscribir, PlanCtrl"); 
    }); 

Таким образом, перенаправление происходит только если ответ от сервера был успешным, и нет необходимости использовать $window.location.reload(true);

Я хочу, я могу дать вам более подробную информацию о причине проблема, но мой английский недостаточно хорош.