【问题标题】:ngResource default parameters from promise来自promise的ngResource默认参数
【发布时间】:2015-10-11 03:13:11
【问题描述】:

我有几个这样的休息服务

/user/:userId/resource/:resourceId

大多数时候用户想要获得自己的资源(尽管有时他想要获得另一个用户的资源) 所以我希望默认参数是当前用户 ID,但我无法将 UserId 保存在 rootscope/service 上,因为如果用户刷新浏览器,这将消失,所以我想做这样的事情:

$resource('/user/:userId/resource/:resourceId', { userId: getUserId, resourceId: '@id' })

问题在于 getUserId() 返回一个承诺:

function getUserId() {
    if (!$rootScope['user']) {
        $rootScope['user'] = UserService.get({ userId: 'current' })
    }
    return $rootScope['user'].$promise.then(function (user) {
        return user.id;
    }
}

如何使它适用于所有服务(因为现在我总是在 userId getter 之后链接每个资源服务......有没有更好的方法?

【问题讨论】:

  • 就个人而言,我在会话中存储了这样的非敏感数据。这样,在浏览器关闭或用户注销之前,它都可以轻松访问和使用。这比尝试设置服务来处理此类事情要容易得多。
  • 如果它是一个常规的 $http 调用,它会很容易,因为资源的行为,资源的工作量更大。如果您将该 $resource 更改为常规 $http 调用,我可以为您提供帮助,并且您可以从那里进行调整。
  • @BenjaminGruenbaum 我知道手动构建这样的请求是可能的,但是我有很多restful apis并且ngResource库很好地为我服务。
  • 好吧,你总是可以在路由器的resolve 子句中为 userId 做出承诺。
  • @BenjaminGruenbaum 很好,我从未使用过“解决”功能,看起来很有用,谢谢。但是现在大家提倡不要直接使用带路由的控制器,而是通过指令来代替,并且将另一个通用变量传递给每个指令是很麻烦的。似乎我可以直接将本地存储连接到请求,而我可以忘记查找从哪里获取用户 ID。你知道做一些类似于解决功能的方法吗?等待承诺同步解决?因为如果可以做到,我可以将其连接起来,而不是通过路由器。

标签: angularjs promise angular-promise angularjs-resource


【解决方案1】:

使用浏览器会话来存储这些非敏感数据。

// Set the user object into the session as a JSON object
function setUser(user) {
    sessionStorage.setItem("user", JSON.stringify(user));
}

// Retrieve user object and parse the userID
function getUserId() {
    var tmpUser = JSON.parse(sessionStorage.getItem('user'));
    return tmpUser.userID;
}

那么您的 $resource 将不会返回任何承诺,您可以从代码中的任何位置访问/修改用户 ID,而不会污染您的 $rootScope。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 2018-08-23
    • 2019-12-14
    • 2016-01-06
    相关资源
    最近更新 更多