2015-05-06 2 views
4

Вот рабочий процесс:.

страница учетной записи пользователя должен перечислить все объекта, принадлежащего этому пользователю.

Рядом с каждым объектом находится кнопка «удалить», которая открывает мода Bootstrap. Модаль спрашивает пользователя, действительно ли он хочет удалить объект, и если они подтвердят, то модальный должен уйти, объект должен быть удален, а представление должно обновиться, чтобы отразить удаление.

Я отклоняю модальный атрибут data-dismiss на кнопке подтверждения внутри модального.

Вот функция в мой контроллер, который удаляет объект и (должны) обновить вид:

$scope.deleteObject = function(object) { 
    object.destroy({ 
     success: function(object) { 
     $scope.$apply(); 
     }, 
     error: function(object, error) { 
     // handle error 
     } 
    }); 
    }; 

Однако, я должен обновить страницу, чтобы увидеть обновленный вид с объектом удален.

Есть ли другой способ использовать $scope.$apply?

EDIT: Я нашел обходной путь, создав новую функцию уровня $ scope для загрузки моей коллекции объектов. Ранее это было сделано, когда контроллер загружается (не привязан к какой-либо конкретной функции

Другими словами, мой старый код сделал это:.

.controller('AccountCtrl', function($scope) { 
    var query = new Query('Object'); 
    query.find().then(function(objects) { 
    $scope.objects = objects; 
    }); 

    $scope.deleteObject = function(object) { 
    object.destroy({ 
     success: function(object) { 
     // do something 
     } 
    }); 
    } 
}); 

Теперь я завернул find код в $ функция уровня охвата, который я могу назвать явным, когда объект будет уничтожен:

.controller('AccountCtrl', function($scope) { 
    $scope.getObjects = function() { 
    var query = new Query('Object'); 
    query.find().then(function(objects) { 
     $scope.objects = objects; 
    }); 
    } 

    $scope.getObjects(); // call when the view loads 

    $scope.deleteObject = function(object) { 
    object.destroy({ 
     success: function(object) { 
     $scope.getObjects(); // call again when an object is deleted 
     } 
    }); 
    } 
}); 

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

+0

Это может помочь http://jimhoskins.com/2012/12/17/angularjs-and-apply.html – DrCord

+0

как насчет использования обратного вызова $ timeout и вызова $ apply в нем – Sn0opr

+2

Это должно работать без $ apply - у вас есть проблема где-то в коде –

ответ

0

В вашем успехе вам нужно изменить локальные объекты $ scope.object.

В вас последний Exemple вы должны попробовать этот код (не проверял, но это, как это должно выглядеть):

$scope.deleteObject = function(object) { 
    object.destroy({ 
     success: function(object) { 
     var objectIndex = $scope.objects.indexOf(object); 
     $scope.objects.splice(objectIndex,1); 
     } 
    }); 
    } 

В контроллере вы берете на себя ответственность за обновление модели. Угловые берут на себя ответственность за обновление представления. Вызов снова $ scope.getObjects() - это способ сделать это. Но более чистый способ - это реализовать ваше обновление модели в случае успеха. Вы также должны дать метод ошибки в случае, если ответ сервера является ошибкой.

Если вы правильно связали коллекцию с вашим представлением, я должен обновить ее после удаления. Скажи мне, помогло ли тебе это.

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