2012-09-29 30 views
14

在以下场景中传递消息的最佳方式是什么?在视图之间传递对象(flash message)

在成功方案$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') 
}); 

回答

16

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

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

这里有一个演示:

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

+0

非常感谢你的帮助和努力。 – bsr

+0

我刚刚编辑它,我想到了一个**更好更简单的实现,它使用数组支持多个闪烁。 –

+1

您也可以考虑使用'$ routeChangeStart',因为有时(取决于您的设置)成功在进程中调用得太晚(新页面可能已经加载并且解决了警报范围)。 –

0

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

5

我一直在寻找实现类似的功能,但实际上需要更多的咆哮式的消息。

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

我的更新还可以让你指定通知类型(信息,警告,成功,错误)和标题。

'pop'方法跳过将消息添加到队列中,而是立即将其弹出到屏幕上。 Andy之前的plinkr的set/get功能大部分保持不变。

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

+0

值得注意的是,如果你传入flash.set()的消息对象是ngmodel,它通过引用传递,所以队列中的多个条目都将是克隆同一个对象。 换句话说,如果你这样做: $ scope.msg = {title:'title',body:'msg body',type:'info'}; 然后有一个表单使用这个作为它的模型,并通过这个范围变量进行设置,任何已经在队列中的将被改变为包含新的值......这种类型的打败了消息队列的目的;) –

+0

Your原始示例在加载toatr库时遇到了问题 - 我更新了示例并将inastr脚本内联:http://plnkr.co/edit/vSWKtv?p=preview –

+0

谢谢。自从我写这篇文章以来,事情一定会发生变化..它之前正在加载:) –