当我学到角度时,有两个问题困扰着我:
当用户刷新页面或点击后退按钮时,如何恢复状态?
如何在属于不同控制器的合并范围之间共享数据?
下面我展示了一个使用客户端会话存储的简单解决方案。在用户刷新页面或点击后退按钮后,它既允许共享公共数据,又可以自动恢复状态。
注意:事实证明,以下解决方案对于回答以下问题至关重要:
如何获得“后退”按钮以与AngularJSui路由器状态机一起使用?
解决方案取决于SessionService
下面显示的类。语法是coffeescript。
SessionService类别
class SessionService
scopes:[]
setStorage:(key, value) ->
scope[key] = value for scope in @scopes
value = if value is undefined then null else JSON.stringify value
sessionStorage.setItem key, value
getStorage:(key)->
sessionValue = sessionStorage.getItem key
if sessionValue == "undefined"
return null
JSON.parse sessionValue
register:(scope)->
for key, value of sessionStorage
scope[key] = if value? and value != "undefined" then JSON.parse(value) else null
@scopes.push scope
scope.$on '$destroy', =>
@scopes = @scopes.filter (s) -> s.$id != scope.$id
clear: ->
@setStorage(key, null) for key of sessionStorage
isAuthenticated: ->
@accessor 'isAuthenticated', value
user:(value=null) ->
@accessor 'user', value
# other storage items go here
accessor:(name, value)->
return @getStorage name unless value?
@setStorage name, value
angular
.module 'app.Services'
.service 'sessionService', SessionService
在SessionService
类定义的isAuthenticated
属性(简单布尔)和user
属性(一个复杂的对象)。这些属性的值在使用sessionStorage
javascript提供的客户端本地对象存储/检索时会自动进行字符串化/解析。
您 根据需要 添加 更多属性
。就像$rootScope
您少量添加属性一样。与$rootScope
属性不同,在刷新页面或单击后退按钮后,属性值仍然可用。
该服务允许向其注册任意数量的范围。注册范围后,所有存储的值sessionStorage
将自动分配给该范围。这样,所有注册的作用域始终可以访问所有会话属性。
更新属性值时,所有注册的作用域都会更新其对应的值。
当angular破坏范围时,它将自动从已注册范围的列表中删除,以节省浪费的资源。
如果用户刷新页面或单击后退按钮,则强制角度应用程序重新启动。通常,这意味着您将必须重构当前状态。将SessionService
自动为您做到这一点,因为每个范围将是从本地存储恢复它的价值时,他们的应用程序初始化期间注册。
因此,现在很容易解决在范围之间共享数据以及在用户刷新或单击后退按钮时还原值的问题。
这是一些示例角度代码,显示了如何使用SessionService
该类。
在某些Controller中向SessionService注册范围
angular
.module 'app'
.controller 'mainCtrl', ($scope, $state, session, security) ->
#register the scope with the session service
session.register $scope
#hook up the 'login' method (see security service)
$scope.login = security.login
# check the value of a session property
# it may well be true if the page has been refreshed
if session.isAuthenticated
$state.go('home')
else
$state.go('login')
在服务中设置会话值
class SecurityService
@$inject:['$http','sessionService', 'api']
constructor:(@http, @session, @api) ->
login:(username, password) =>
@http.get "#{@api.base}/security/login/credentials/#{username}/#{password}"
.success (user)=>
@session.isAuthenticated = true
@session.user = user
.error (ex)=>
# process error
angular
.module 'app'
.service 'securityService', SecurityService
在UI中使用会话值(Jade模板)
div(ng-show="isAuthenticated")
div Hello {{user.Name}}
问题内容: 在完全基于服务器端的呈现(非Web 2.0)中,部署服务器端代码将在页面重新加载时直接更新客户端页面。相比之下,在基于React的Single Page Application中,即使在更新React组件之后,仍然会有一些客户端使用这些组件的旧版本(它们仅在重新加载浏览器时才获得新版本,这种情况很少发生)->如果页面如果是完全SPA,则某些客户端可能会在几个小时后才刷新页面。 应采用什
在完全基于服务器端的呈现(非Web 2.0)中,部署服务器端代码将在页面重新加载时直接更新客户端页面。相反,在基于React的单页应用程序中,即使在React组件更新后,仍然会有一些客户机使用旧版本的组件(他们只在浏览器重新加载时获得新版本,这应该很少发生)->如果页面是完全SPA,一些客户机可能在几个小时后才刷新页面。 应该使用什么技术来确保旧的组件版本不再被任何客户使用?
问题内容: 我需要在单页应用程序中检测页面刷新事件。 问题答案: 您不确定,因为刷新浏览器页面等同于退出应用程序然后再次打开它。 您可以做的是检测页面退出事件和应用程序打开事件。 在app.run()块中注入“窗口”依赖项并添加: 并在$ routeChangeStart事件上 而且如果绝对需要链接这两个事件,它必须在后端/服务器端..... 我希望这有帮助。
问题内容: 如何使用jQuery刷新页面? 问题答案: 用途: 该函数采用一个可选参数,可以将其设置为强制从服务器而不是从缓存重新加载。该参数默认为,因此默认情况下该页面可能会从浏览器的缓存中重新加载。
本文向大家介绍如何使用Google Analytics(分析)跟踪单页应用程序中的页面?,包括了如何使用Google Analytics(分析)跟踪单页应用程序中的页面?的使用技巧和注意事项,需要的朋友参考一下 单页应用程序(SPA)加载浏览整个站点所需的资源。这是用于首页加载,SPA是Web应用程序或网站。 当您单击站点的链接并且用户与页面进行交互时,内容将动态加载。加载时,跟踪器中存储的数据也
问题内容: 我有一个使用angularJS的单页Web应用程序。我需要打印某个页面的div。我尝试了以下方法: 该页面包含少量div(print.html) 控制器具有以下脚本: 此代码可打印所需的div,但存在问题。该语句代替了整个应用程序的主体,因为它是SPA。因此,当我刷新页面或再次单击“打印”按钮时,页面的全部内容将被删除。 问题答案: