0

我有一个用 C# 定义的基本控制器,它的唯一目的是返回当前用户是谁。

    namespace ProjectName.Controllers
{
    public class UserController : ApiController
    {


        // GET api/user/
        public string Get()
        {
            return User.Identity.Name;
        }

    }
}

然后我定义了一个 ngResource 来查看该控制器

cript.factory('User', function ($resource) {
return $resource('/api/User')
});

最后我尝试在我的 Angular 控制器中获取该用户

    $scope.checkIfAuth = function () {
    $scope.user = User.get();

    console.log($scope.user);

    if ($scope.user === '"DS//:lemieszr"') {
        console.log("success");
    }
};

问题是 $scope.user 是一个看起来像这样的资源对象

    Resource {$get: function, $save: function, $query: function, $remove: function, $delete: function}
    0: """
    1: "D"
    2: "S"
    3: "\"
    4: "\"
    5: "l"
    6: "e"
    7: "m"
    8: "i"
    9: "e"
    10: "s"
    11: "z"
    12: "r"
    13: """
    __proto__: Resource

反正有没有得到包含我的用户名的字符串。User.query() 只返回一个空数组。

4

2 回答 2

1

User.query()返回一个空数组,因为它需要一个 json 对象数组[{...},{...}]作为后端的响应。User.get 假设您的服务器返回一个类似 {"name":"Andi"} 的对象,因此如果您的服务器响应正确,则 get 方法没有问题。

$scope.user = User.get();

比您可以访问您的名称属性为$scope.user.name

这个 plumk 可以帮助你链接

于 2013-06-20T16:33:46.157 回答
1

我建议研究 Angular 对 Kris Kowal 的 Q 承诺库 ( $q ) 的实现。我现在也在使用 mvc 4.0,我发现它比 ngResource 灵活得多。

但是,具体就您的问题而言,您的问题是您正在向服务器发出异步请求,同时同步调用其响应。好吧,数据还没有到达那里(为什么你看到一个空数组[])。那个空数组基本上是服务器在说“嘿,在你的 http 请求上遵循协议做得很好,我们正在获取你的数据,在这里向你证明它是一个空数组,当它到达你时我们会将数据放在那里。”

换句话说,您的问题是您要求设置检查 $scope.user 的值之前它甚至有一个(粗略地说)。

您有两个简单修复的选项(至少据我所知):您可以将 $scope.user 设置为 SEPARATE 函数或其他服务中来自服务器的响应,然后在响应到达时使用它。或者(更好的“简单”修复)使用$timeout服务,它本质上告诉你的系统“冷静下来,直到我的异步请求完成并且我有我的数据”。

于 2013-06-20T16:10:57.217 回答