14

在以下情况下传递消息的最佳方式是什么。

在 的成功场景中$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')
});
4

3 回答 3

16

您可以使用在 $routeChangeSuccess 上显示 flash 的服务。

每次你设置一个 flash 消息时,将它添加到队列中,当路由改变时,从队列中取出第一个项目并将其设置为当前消息。

这是一个演示:

http://plnkr.co/edit/3n8m1X?p=preview

于 2012-09-30T19:48:23.367 回答
5

我希望实现类似的功能,但实际上想要更多的咆哮式信息。

我已经更新了 Andy 上面提供的优秀 plinkr 代码,以包含一个利用toastr咆哮式通知库的“pop”方法。

我的更新还允许您指定通知类型(信息、警告、成功、错误)和标题。

'pop' 方法跳过将消息添加到队列中,而是立即将其弹出到屏幕上。Andy 以前的 plinkr 的设置/获取功能基本保持不变。

你可以在这里找到我的更新:http: //plnkr.co/edit/MY2SXG ?p=preview

于 2013-01-12T09:37:17.380 回答
0

我不相信有一种方法可以默认 AngularJS。您最好的选择只是通过查询字符串传递消息(编码)。

于 2012-09-29T19:56:08.453 回答