标签: angularjs-resource

缓解POST响应的"最佳"练习

所以这里没什么新鲜的,我只是想弄清楚一些,似乎无法在其他帖子中找到任何内容.

我正在创造一个新的资源,说:

/books (POST)
Run Code Online (Sandbox Code Playgroud)

身体:

{
  title: 'The Lion, the Witch and the Wardrobe',
  author: 'C. S. Lewis'
}
Run Code Online (Sandbox Code Playgroud)

我知道我应该返回201(Created),其中包含新资源的Location头:

Location: /books/12345
Run Code Online (Sandbox Code Playgroud)

我似乎无法回答的问题是服务器应该在体内返回什么.

我经常做这种反应:

{
  id: 12345,
  title: 'The Lion, the Witch and the Wardrobe',
  author: 'C. S. Lewis'
}
Run Code Online (Sandbox Code Playgroud)

我这样做有几个原因:

  1. 我为像angularjs这样的前端框架编写了api.在我的特定情况下,我使用角度资源,我经常只需要资源的ID来找到它.如果我没有在响应正文中返回id,我需要从Location头解析它.
  2. 在所有书籍的GET中,我通常返回整个对象而不仅仅是id.从这个意义上说,我的客户端代码不必区分从哪里获取id(位置标题或正文).

现在我知道我真的在这里的灰色区域,但大多数人都说回归整个资源是"坏"的做法.但是,如果服务器更改/添加信息到资源,该怎么办?它肯定会添加id,但也可能添加其他内容,如时间戳.在我不返回整个资源的情况下,最好是进行POST,返回id,然后让客户端执行GET以获取新资源.

rest angularjs angularjs-resource

194
推荐指数
2
解决办法
15万
查看次数

如何在AngularJS中刷新/无效$ resource缓存

我有一个简单的User $资源,使用默认的$ http缓存实现,如下所示:

factory('User', function($resource){
    return $resource(endpoint + '/user/current/:projectId', {},
        {get: 
            {
                cache: true,
                method: 'GET'
            }
        }
    );
})
Run Code Online (Sandbox Code Playgroud)

这非常有效,即我的服务器只在我的应用程序中调用一次,然后从缓存中获取值.

但是我需要在某个操作后刷新服务器的值.有一个简单的方法吗?

谢谢.

angularjs angularjs-resource

94
推荐指数
3
解决办法
6万
查看次数

Angular - 使用自定义方法扩展$ resource子对象

在大多数情况下,<custom-resource>.query()方法的结果是一个数组,可以使用以下(工厂)代码通过某些方法(业务逻辑)轻松扩展:

var Data = $resource('http://..');
Data.prototype.foo = function() {return ...};
Run Code Online (Sandbox Code Playgroud)

这非常适合与ng-repeat/ng-class一起使用,如下所示:

<tr ng-repeat="item in responseData" ng-class="{warning: item.foo()}">..</tr>
Run Code Online (Sandbox Code Playgroud)

我的问题是每个列表响应都封装在一个对象中,除了实际列表之外,它还有一些元属性(排序信息等),所以返回的最终对象是这样的:

{ order_field: "name", items: [{..}, {..},{..}] }
Run Code Online (Sandbox Code Playgroud)

现在,我如何使用ng-repeat/ng-class进行与之前相同的操作?

<tr ng-repeat="item in responseData.items" ng-class="????">..</tr>
Run Code Online (Sandbox Code Playgroud)

之前的方法不起作用,因为定义了"foo"方法responseData而不是item对象

有没有办法直接扩展用于实例化列表中对象的基类?

谢谢!

javascript angularjs angularjs-resource

37
推荐指数
2
解决办法
2万
查看次数

在angular $ resource上添加自定义函数

我有一个像这样的角度资源

app.factory('User', function ($resource) {
    return $resource(
        '/api/user/:listCtrl:id/:docCtrl/', {
            id: '@id',
            listCtrl: '@listCtrl',
            docCtrl: '@docCtrl'
        }, {
            update: {
                method: 'PUT'
            },
            current: {
                method: 'GET',
                params: {
                    listCtrl: 'current'
                }
            },
            nearby: {
                method: 'GET',
                params: {
                    docCtrl: 'nearby'
                },
                isArray: true
            }
        }
    );
});
Run Code Online (Sandbox Code Playgroud)

现在我想在视图中有全名,我可以添加一个方法,这样当我这样做

$scope.user = User().current();
Run Code Online (Sandbox Code Playgroud)

而不是在HTML中执行以下操作

<p>{{ user.first_name }} {{ user.last_name }}</p>
Run Code Online (Sandbox Code Playgroud)

我这样做

<p>{{ user.get_full_name }}</p>
Run Code Online (Sandbox Code Playgroud)

有没有办法将此属性添加到$resource

javascript angularjs angularjs-scope angularjs-resource

21
推荐指数
2
解决办法
2万
查看次数

如何使用角度中的请求正文发送url模板参数?

假设我有一个这样的资源设置:

resource = $resource(
    "http://foo.com/service/:type/:id",
    {},
    {save: {method:'PUT', params: {type:'@type', id: '@id'}}}
);
resource.save({type:'user', id:14, name:'Bob Dole'});
Run Code Online (Sandbox Code Playgroud)

有什么方法可以阻止typeid作为请求体的一部分提交,只是发送namePUT有效载荷?我不控制我提交的API,它似乎不喜欢我发送它的额外参数.

谢谢!

更新 - 2013年10月25日 - 13:38

资源文档说:

如果参数值以@为前缀,则从数据对象中提取该参数的值(对非GET操作很有用).

这意味着这应该从数据中删除参数:

resource.save({type:'@user', id:'@14', name:'Bob Dole'});
Run Code Online (Sandbox Code Playgroud)

但它似乎没有用.还是不知所措.

angularjs angularjs-resource

21
推荐指数
2
解决办法
1万
查看次数

在发布请求后使$ resource Cache无效

我正在使用$ resource并缓存get请求的结果.我的问题是,在发布请求后,缓存未被无效.

以下是服务的返回值:

return $resource('http://url.com/api/url/:id', {}, {
'query' : {
      method : 'GET',
      isArray:true,
      cache : true
    },
'get' : {
  method : 'GET',
  cache : false
}  
})
Run Code Online (Sandbox Code Playgroud)

这是我在控制器中使用的保存方法.如您所见,我正在使用post请求上的回调来重新计算查询/名词列表.

var newNoun = new Noun($scope.noun);
newNoun.$save(function(x) {
  $scope.nouns = Noun.query();
});
Run Code Online (Sandbox Code Playgroud)

我想在调用post或其他非get方法后使缓存无效.我怎么能这样做?这已经内置到$ resource中了还是我需要自己实现它?

angularjs angularjs-resource

18
推荐指数
2
解决办法
6956
查看次数

如何扩展AngularJS资源($ resource)的构造函数?

我有一个模型,定义使用$resource,我成功加载.

正如所承诺的,每个加载的实例都是我定义的类的实例.

(以下示例来自Angular文档.在其中,User.get结果是一个对象instanceof User.)

var User = $resource('/user/:userId', {userId:'@id'});
Run Code Online (Sandbox Code Playgroud)

但是,想象每个用户来自这样的电线:

{
  "username": "Bob",
  "preferences": [
    {
      "id": 1,
      "title": "foo",
      "value": false
    }
  ] 
}
Run Code Online (Sandbox Code Playgroud)

我定义了一个PreferencePreference对象添加有价值方法的工厂.但是当用户加载时,这些preferences不是Preference自然的.

我试过这个:

User.prototype.constructor = function(obj) {
  _.extend(this, obj);
  this.items = _.map(this.preferences, function(pref) {
    return new Preference(pref);
  });
  console.log('Our constructor ran'); // never logs anything
}
Run Code Online (Sandbox Code Playgroud)

但它没有任何效果,也从未记录任何东西.

如何使我的Users' preferences数组中的每个项目成为一个实例Preference

angularjs angularjs-factory angularjs-resource

15
推荐指数
2
解决办法
9275
查看次数

具有多个可选get参数的Angular 1.0.8 $资源

我的学生ulr看起来像这样:

var Student = $resource('/app/student/:studentid:courseId',
    {studentid:'@id',courseId:'@cid'}
);
Run Code Online (Sandbox Code Playgroud)

当我在没有参数的情况下调用它时,我希望网址是/app/student/(工作)

var names=Student.query(
  function(){
      deferred.resolve(names);
  }
);
Run Code Online (Sandbox Code Playgroud)

当我用studentid调用它时,我希望url是/app/student/?id=88(工作)

    Student.get({"id":id},
      function(data){
          deferred.resolve(data);
      }
    );
Run Code Online (Sandbox Code Playgroud)

当我用courseid打电话时我想要的网址是/app/student/?courseid=99(不)

    Student.query({courseId:cId},
      function(data){
          deferred.resolve(data);
      }
    );
Run Code Online (Sandbox Code Playgroud)

相反,我得到: /app/student/6682831673622528

当我打电话给学生和课程时,我想:/app/student/?id=1&courseid=2 我得到了/app/student/12

为网址尝试这样的东西:/app/student/:studentid&:courseid给我/app/student/1&2

不知何故,只提供studentntid作品,但courseid或两者并不像我想要的那样工作.我不确定我会怎么想,因为文档中没有任何关于多个参数作为查询字符串的内容(有扩展url /app/student/studentid/1/courseid/2但是因为它是一个xhr请求我想让它请求/app/student/附加的GET参数?one=val&two=val

有没有办法做到这一点?

getparameter angularjs angularjs-resource

14
推荐指数
1
解决办法
2万
查看次数

使用$ resource时,量角器会等待与页面同步

我正在使用一个小型AngularJS应用程序测试Protractor.

这是测试:

describe('Testing Protractor', function() {
  var draftList;

  it('should count the number of drafts', function() {
    browser.get('#/');
    draftList = element.all(by.repeater('newsletter in drafts'));
    expect(draftList.count()).toEqual(2);
  });
});
Run Code Online (Sandbox Code Playgroud)

控制器:

angular.module('myApp.controllers', []).
  controller('DraftsCtrl', ['$scope', 'Draft', function($scope, Draft) {
    $scope.drafts = Draft.query();
}])
Run Code Online (Sandbox Code Playgroud)

服务草案:

angular.module('myApp.services', ['ngResource']).
  factory('Draft', ['$resource',
    function($resource) {
      return $resource('api/drafts/:id')
    }])
Run Code Online (Sandbox Code Playgroud)

使用Protractor运行此测试会导致以下错误:

Error: Timed out waiting for Protractor to synchronize with the page after 11 seconds
Run Code Online (Sandbox Code Playgroud)

但是,如果在控制器中我改变了这一行:

$scope.drafts = Draft.query();
Run Code Online (Sandbox Code Playgroud)

对此:

$scope.drafts = [];
Run Code Online (Sandbox Code Playgroud)

测试按预期失败,但更重要的是:它没有超时.

启用query()后,无论是在浏览器中手动运行应用程序还是查看Protractor打开的浏览器窗口时,API返回的数据都由转发器正确显示.

为什么当服务与API通信时,Protractor无法与页面同步?

AngularJS是v1.2.0-rc3.量角器是v0.12.0.

javascript angularjs angularjs-resource protractor

14
推荐指数
1
解决办法
2万
查看次数

如何从$资源获得空响应?

如何从$资源获得空响应?

我正在运行这个:

angular.module("services").factory('Member', function($resource) {
  var Member = $resource('/api/v1/member.json');

  Member.current = Member.get();

  return Member;
});
Run Code Online (Sandbox Code Playgroud)

但服务器响应:

null
Run Code Online (Sandbox Code Playgroud)

因为用户未登录.

但是当我记录结果时,我得到了这个:

Resource
  0: "n"
  1: "u"
  2: "l"
  3: "l"
  $promise: Object
  $resolved: true
  __proto__: Resource
Run Code Online (Sandbox Code Playgroud)

我在字面上的预期null.

javascript angularjs angularjs-resource

13
推荐指数
1
解决办法
3740
查看次数