2014-02-18 6 views
1

У меня есть интересная проблема с функциями $ http.delete() и $ window.location.reload(). В основном я вызываю метод delete, который в свою очередь вызывает вызов $ http.delete(), который - с использованием интерфейса API REST - удаляет данные из базы данных (mongoDB). По неизвестным причинам это не то, что происходит:

  • удаление успешно в базе данных
    • это проверяется, как данные больше не находится в базе данных
    • также контролируется с помощью Chrome DevTools он показывает статус: 200
  • $ window.location.reload() вызывается, и ничего не происходит
    • Chrome DevTools показывает GET вызов к корню домена но статус «в ожидании»

Страница не тайм-аут, он в основном держится на погрузке и загрузке и погрузки. Как только я нажму Refresh/CTRL-F5, все вернется в норму, и я вижу, что мой элемент удален.

Некоторые выдержки из моего кода:

app.js

angular.module('contacts', ['ngRoute', 'contacts.factory', 'contacts.filters', 'ui.bootstrap']). 
    config(['$routeProvider', '$locationProvider', function($routeProvider, $locationProvider) { 
    $routeProvider. 
     when('/', { 
     templateUrl: '/p/list', 
     controller: ListCtrl, 
     }). 
     otherwise({ 
     redirectTo: '/' 
     }); 
    $locationProvider.html5Mode(true); 
    }]); 

controllers.js

function ListCtrl($scope, $modal, contactFactory) { 
//code removed 
    $scope.delete = function(c) { 
    var id = c._id; 
    var modalInstance = $modal.open({ 
     templateUrl: 'deleteContactModal', 
     controller: deleteContactModalCtrl, 
     resolve: { 
     contact: function() { 
      return contactFactory.getContact(id); 
     } 
     } 
    }); 
    } 
} 

var deleteContactModalCtrl = function($scope, $route, $modalInstance, $window, contact, contactFactory) { 
    $scope.name = contact.data.contact.name; 

    $scope.deleteContact = function() { 
    contactFactory.deleteContact(contact.data.contact._id).success(function() { 
     //have also tried: $window.location.reload(true); 
     //as well as window.location.href('/') - didn't work either 
     $modalInstance.close($window.location.reload()); 
    }); 
    }; 
} 

factory.js

angular.module("contacts.factory", []). 
    factory('contactFactory', function($http){ 
    return { 
     //code removed 
     deleteContact: function(id) { 
     return $http.delete('/api/contact/' + id); 
     } 
    } 
    }); 

бэкенд - app.js

//usual express setup 
app.delete('/api/contact/:id', api.delete); //delete contact 

бэкенд - api.js

//code removed 
exports.delete = function (req, res) { 
    var id = req.params.id; 
    if (id) { 
    ContactModel.findById(id, function (err, contact) { 
     contact.remove(function (err) { 
     if (!err) { 
      res.json(true); 
     } else { 
      res.json(false) 
      console.log(err); 
     } 
     }); 
    }); 
    } 
}; 

На данный момент я даже не уверен, что если эта проблема связана с веб-интерфейсе или в интерфейсе. Как упоминалось ранее - бэкэнд-часть работает нормально - данные удаляются из БД.

+0

Вы можете использовать приложение POSTMan/расширение в chrome для проверки бэкэнда независимо от переднего конца. Если все будет хорошо, я бы начал отбрасывать заявления отладчика по всему угловому коду, чтобы наблюдать за некоторыми из переменных, чтобы убедиться, что все, как представляется, вызывается по порядку, также проверяйте консоль повсюду, чтобы убедиться, что никаких предупреждений или ошибок не выбрасывается. Я считаю, что $ resource в угловом выражении не возвращает обещания, когда вы вызываете delete, но вместо этого вам нужно передать функцию обратного вызова на вызов delete. – shaunhusain

+0

Я сделал простой «curl -i -X ​​DELETE http: // tamas: 3000/api/contact/5303a83f3c8a52a20e7ac53f», и это сработало - HTTP/1.1 200 OK. Можете ли вы подробнее рассказать о вызове $ resource/delete? – Tamas

+0

Ах, извините, я вижу, что вы используете $ http, на первый взгляд, хотя вы использовали $ resource, который не возвращает обещание от вызовов метода.С $ http у меня только был опыт использования get и post, но не удаление, хотя документы говорят, что он также должен вернуть обещание/будущий объект. – shaunhusain

ответ

4

Хорошо решение, кажется следующее:

$scope.deleteContact = function() { 
    contactFactory.deleteContact(contact.data.contact._id).success(function() { 
     $modalInstance.close(); 
     contactFactory.getContacts().success(function(contacts) { 
     return $scope.contacts = contacts; 
     }); 
     $window.location.reload(); 
    }); 
    }; 

Мне нужно, чтобы получить getContacts() метод с моей фабрики снова во время удаления метода.

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