2012-09-29 31 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

謝謝。自從我寫這篇文章以來,事情一定會發生變化..它之前正在加載:) –