在下面的场景中传递消息的最佳方式是什么。
在$scope.p.$save
的成功案例中,结果包含一条消息(res.message
),我希望在下一个视图($location.path("/test/"+res.reply.Id)
)中显示该消息。没有AngularJS,我可以在URL中传递它或将其保存在会话cookie中。但是,我想AngularJS可能有更好的方法,因为没有浏览器重定向,状态应该可用。实现这一目标的最佳方法是什么?
在我使用浏览器后退按钮时,在rootScope中设置它会显示它,并且消息的范围应仅用于第一次导航到新视图。
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')
});
答案 0 :(得分:16)
您可以使用在$ routeChangeSuccess上显示闪存的服务。
每次设置Flash消息时,将其添加到队列中,当路由更改时,将第一个项目从队列中取出并将其设置为当前消息。
这是一个演示:
答案 1 :(得分:5)
我希望实现类似的功能,但实际上想要更多的咆哮风格消息。
我已经更新了Andy提供的优秀plinkr代码,其中包含一个利用toastr咆哮风格通知库的“pop”方法。
我的更新还允许您指定通知类型(信息,警告,成功,错误)和标题。
'pop'方法会跳过将消息添加到队列中,而是立即将其弹出屏幕。 Andy以前的plinkr的set / get功能基本保持不变。
您可以在此处找到我的更新:http://plnkr.co/edit/MY2SXG?p=preview
答案 2 :(得分:0)
我不相信有一种方法可以将此默认设置为AngularJS。您最好的选择就是通过查询字符串传递消息(编码)。