Передача объекта между представлениями (флэш-сообщение)
Каков наилучший способ передачи сообщения в приведенном ниже сценарии.
В сценарии успеха $scope.p.$save
результат содержит сообщение (res.message
), которое мне нравится отображать в следующем представлении ($location.path("/test/"+res.reply.Id)
). Без AngularJS я могу передать его в URL-адресе или сохранить его в сессионных файлах cookie. Но, я думаю, что может быть лучший способ в AngularJS, поскольку нет перенаправления браузера, и состояние должно быть доступно. Каков наилучший способ достичь этого?
Настройка его в корневом каталоге показывает его, когда я использую кнопку "Назад назад", и область действия сообщения должна только для первой навигации к новому представлению.
function NewCtrl(Phone, $location, $rootScope, $scope) {
$scope.p = new Phone();
$scope.save = function () {
$scope.p.$save(
{},
function (res) {
$rootScope.message = res.message **//<-- this will cause message still set when using browser back button, etc**
$location.path("/test/"+res.reply.Id); **//<-- Req: needs to pass the message to next view**
}, function (res) {
//TODO
}
);
};
}
....
PhoneApp.factory('Phone', function ($resource) {
return $resource('/api/test/:_id')
});
Ответы
Ответ 1
Вы можете использовать услугу, которая отображает флеш на $routeChangeSuccess.
Каждый раз, когда вы устанавливаете флэш-сообщение, добавляете его в очередь, а когда изменения маршрута берут первый элемент из очереди и устанавливают его в текущее сообщение.
Вот демо:
http://plnkr.co/edit/3n8m1X?p=preview
Ответ 2
Я хотел реализовать аналогичную функциональность, но на самом деле хотел больше сообщения стиля рычания.
Я обновил отличный код plinkr, который Andy предоставил выше, чтобы включить метод "pop", который использует toastr библиотеку уведомлений стиля. p >
Мое обновление также позволяет вам указать тип уведомления (информация, предупреждение, успех, ошибка) и заголовок.
Метод "pop" пропускает добавление сообщения в очередь и вместо этого выводит его на экран немедленно. Функция set/get от Andy previous plinkr остается в основном неизменной.
Вы можете найти мое обновление здесь: http://plnkr.co/edit/MY2SXG?p=preview
Ответ 3
Я не верю, что это можно сделать по умолчанию для AngularJS. Лучше всего передать сообщение (закодированное) через строку запроса.