角度解决应用程序重新加载

时间:2015-06-25 17:28:15

标签: javascript angularjs promise angular-promise

如何在页面重新加载时延迟应用程序控制器的初始化(路由器中的“解析”属性)?或许更好的问题,如何延迟视图直到我的控制器检索到用户对象,特别是在页面重新加载?

我目前在ApplicationCtrl的顶部有这个

if (localStorage.getItem('token') && localStorage.getItem('token') != 'null')
{
    sessionStorage.setItem('token', localStorage.getItem('token'))
}
if (sessionStorage.getItem('token') && sessionStorage.getItem('token') != 'null')
{
    UserSvc.getUser()
    .then(function (response) 
    {
        loadUser(response.data)
    })
    .then(function (error)
    {
        if (error) $scope.logout()
    })
}

这将检查身份验证令牌,然后使用该令牌从数据库中获取用户对象。

但问题是页面出现后用户数据断断续续,因此在用户的显示名称突然出现几毫秒之后,我们的导航栏才为空。

如何在最初的用户请求完成之前延迟显示此视图?

2 个答案:

答案 0 :(得分:1)

想出来。我刚刚创建了一个顶级$ scope boolean $ scope.initResolved,它通过完成第一次用户检查(无论是否检索用户)呈现为真,并将头文件和ng-view设置为ng-if =“initResolved”

$scope.initResolved = false

    if (localStorage.getItem('token') && localStorage.getItem('token') != 'null')
    {
        sessionStorage.setItem('token', localStorage.getItem('token'))
    }
    if (sessionStorage.getItem('token') && sessionStorage.getItem('token') != 'null')
    {
        UserSvc.getUser()
        .then(function (response) 
        {
            loadUser(response.data)
            $scope.initResolved = true
        })
        .then(function (error)
        {
            if (error) $scope.logout()
            $scope.initResolved = true
        })
    }
    else if ($location.url() == "")
    {
        $location.path('/welcome')
        $scope.initResolved = true
    }
    else $scope.initResolved = true

答案 1 :(得分:1)

然后,这应该放在你的UserStatus状态中,customService将返回包含promise对象的controller。然后,您可以将此服务添加到您的控制器,resolve: function() { 'UserStatus': function(UserSvc) { if (localStorage.getItem('token') && localStorage.getItem('token') != 'null') { sessionStorage.setItem('token', localStorage.getItem('token')) } if (sessionStorage.getItem('token') && sessionStorage.getItem('token') != 'null') { return UserSvc.getUser(); } } } 将等待此依赖性得到解决。

app.controller('myCtrl', function(UserStatus, $scope){
   UserStatus.then(function(data){
      //you will get response here
   })
})

<强>控制器

 Public Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    MyConn.Open()
    Dim sql = "SELECT * FROM [maint]"
    dt.Clear()
    If R1.Checked Then sql = sql & " where datevisite like '%" & dateintervention.Text & "%'  "
    If R2.Checked Then sql = sql & "  [centr] ='" & Me.centra.Text & "'"
    If R3.Checked Then sql = sql & "and  [Priorité] ='" & Me.Priorite.Text & "'"
    If R4.Checked Then sql = sql & "and [Etat_intervention] ='" & Me.etat.Text & "'"
    Dim adapter As New OleDbDataAdapter(sql, MyConn)
    adapter.Fill(dt)
    DGV.DataSource = dt
    DGV.Refresh()
    MyConn.Close()
  End Sub