从restangular加载数据时获取嵌套对象

时间:2013-09-16 23:44:15

标签: angularjs restangular

如果这是一个真正的新手问题,我道歉:我来到AngularJS并作为一个冷酷的开始 - 我正在将一些旧的,后端导向的代码移植到这个花哨的SPA和XHR新世界。

无论如何,这非常简单:我想从我的API加载一个对象。我可以通过这种方式轻松地做到这一点:

App.factory('User', function($cookies, Restangular) {
  if (!$cookies.user_id) {
    return {name: 'Nobody', userId: -1};
  } else {
    return Restangular.one('users', $cookies.user_id).get();
  }
});

App.controller('ApplicationCtrl', function ($scope, User) {
  $scope.user = User;
});

这将(据我所知)让我将当前用户注入到我需要的任何地方(如果cookie不正确,他们最终会在API调用中获得404或401,具体取决于。

我现在遇到的一个简单问题是,当我想在我的模板中访问此用户对象时,它不会绑定到{{user}},而是{{user.user}},因为我注入了$ scope .user使用我的User对象,这是一个JSON创建的对象,它被取回(看起来像{"user":{"id":2,"name":"Eric Eslinger","email":"eric.eslinger@gmail.com"}}所以如果我想说,“你好用户名”我不得不说“你好,{{user.user。 name}}“。这是不满意的。

欢迎任何有关我在设置对象层次结构时缺少的建议;我有一种感觉,我只是错过了一些简单而又重要的东西,我以后需要担心。

1 个答案:

答案 0 :(得分:2)

要回答我自己的问题,这不是一个非常重要的事情,它是一个普遍的角度事物(ngResource的行为方式相同),并且与EmberJS的工作方式有点正交。在EmberJS中,(或者至少是我使用的Ember-Data的版本),JSON api响应应该有一个根元素,Ember-Data类忽略(或用于键入结果对象)。 $ resource和restangular注意根元素。因此,您可以将api更改为仅返回{"id:2" ...而不是{"user":{"id":2 ...,或者您可以对结果执行transformResponse。你的电话。

由于我正在编写API和前端,并且现在没有其他人使用此API(一旦它稳定,那将会改变),我只是改变了API输出JSON的方式。后端使用active_model_serializers,所以我现在只在一些选择位置放置一个, root: false。很容易。