2017-07-31 90 views
0

我创建了一个服务,一旦他登录,所以我可以养活这对我所有的角控制器获得用户的详细信息:AngularJS服务:无法访问子属性

var app = angular.module('myApp', ['ui.calendar', 'ui.bootstrap']); 

app.service('authUser', ['$http', function ($http) { 
var _currentUser = {}; 
$http.get("/Home/GetUser", { 
    cache: false 
}).success(function (data) { 
    _currentUser.userid = data.userId; 
    _currentUser.role = data.userRole; 
    _currentUser.departmentid = data.departmentId; 
    _currentUser.department = data.userDepartment; 
}); 
this.currentUser = _currentUser; 
}]); 

app.controller('eventController', ['$scope', 'authUser', '$http', 'uiCalendarConfig', '$uibModal', function ($scope, authUser, $http, uiCalendarConfig, $uibModal) { 
$scope.currentUser = authUser.currentUser; 

当我尝试显示输出,它看起来好吗:

<div> 
    <label>{{currentUser}}</label> 
    <label>Id: {{currentUser.userid}}, Role: {{currentUser.role}}, Department Id: {{currentUser.departmentid}}, Department Name: {{currentUser.department}}</label> 
</div> 

此输出:

{"userid":"29aa607a-d36b-46bb-a3a7-16bead5f4706","role":"Super 
Admin","departmentid":1,"department":"MIS"} Id: 29aa607a-d36b-46bb-a3a7-16bead5f4706, Role: Super Admin, Department Id: 1, Department Name: MIS 

但是当我尝试使用铜的性质在我的代码中,rrentUser没有任何内容被传递。例如:

$http.get("/Home/GetVenues", { 
    cache: false, 
    params: { 
     currentdepartment: $scope.currentUser.departmentid 
    } 
}).success(function (data) { 
    // ... 
}) 

我试图

$scope.currentdept = $scope.currentUser.departmentid; 

或者

$scope.currentdept = authUser.currentUser.departmentid; 

但是这两种回报什么;米;

我很抱歉,如果我在这里错过了一些非常简单的东西,但我是一个马铃薯请怜悯; m;

如果在这里所有相关的是从我的HomeController我的getUser方法:

public JsonResult GetUser() 
    { 
     if (Request.IsAuthenticated) 
     { 
      ApplicationDbContext db = new ApplicationDbContext(); 
      var user = db.Users.Find(User.Identity.GetUserId()); 
      var userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(ApplicationDbContext.Create())); 
      string id = userManager.FindById(User.Identity.GetUserId()).Id; 
      IList<string> roleNames = userManager.GetRoles(id); 
      ReservationsDatabaseModel dept = new ReservationsDatabaseModel(); 
      Department department = dept.Departments.Find(user.DepartmentID); 

      userDepartmentRole user_department_role = new userDepartmentRole(); 
      user_department_role.userId = user.Id; 
      user_department_role.departmentId = user.DepartmentID; 
      user_department_role.userDepartment = department.Name; 
      user_department_role.userRole = roleNames.FirstOrDefault(); 

      return new JsonResult { Data = user_department_role, JsonRequestBehavior = JsonRequestBehavior.AllowGet }; 
     } 
     else 
     { 

      userDepartmentRole user_department_role = new userDepartmentRole(); 
      user_department_role.userId = "0"; 
      user_department_role.departmentId = 0; 
      user_department_role.userDepartment = "0"; 
      user_department_role.userRole = "Guest"; 
      return new JsonResult { Data = user_department_role, JsonRequestBehavior = JsonRequestBehavior.AllowGet }; 
     } 
    } 
+0

在成功函数里面设置'this.currentUser = _currentUser;' – Vanojx1

+0

我试过了,但现在输出的是 $ scope.currentUser = authUser.currentUser;变成空的:Id:,作用:,部门Id:,部门名称:; m; – Akii

+0

你可以给plunker链接吗? –

回答

0

取回/Home/GetVenues需要等待authUser数据从服务器到达。

更改服务,以节省一个承诺:

app.service('authUser', ['$http', function ($http) { 
    var _ = this; 
    this.currentUser = {}; 

    this.currentUserPromise = $http.get("/Home/GetUser", { 
     cache: false 
    }).then(function (response) { 
     var data = response.data; 
     _.currentUser.userid = data.userId; 
     _.currentUser.role = data.userRole; 
     _.currentUser.departmentid = data.departmentId; 
     _.currentUser.department = data.userDepartment; 
     return data; 
    }); 
}]); 

然后使用控制器的诺言:

authUser.currentUserPromise.then(function(userData) { 

    $http.get("/Home/GetVenues", { 
     cache: false, 
     params: { 
      currentdepartment: userData.departmentid 
     } 
    }).then(function (response) { 
     var data = response.data; 
     // ... 
    }) 

}); 

这种方式为authData控制器等待从服务器从获取之前到达/Home/GetVenues

+0

对于迟到的回复感到抱歉,我们停电了,所以我只是睡觉了; m;谢谢你解释问题是什么:D我跟着这个,现在它正在工作,非常感谢^〜^ – Akii

0

您的电话应只工作返回GetUser API后,您可以通过将GetVenues上的呼叫按钮点击,而不是测试在init上运行。