所以这里没什么新鲜的,我只是想弄清楚一些,似乎无法在其他帖子中找到任何内容.
我正在创造一个新的资源,说:
/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)
我这样做有几个原因:
现在我知道我真的在这里的灰色区域,但大多数人都说回归整个资源是"坏"的做法.但是,如果服务器更改/添加信息到资源,该怎么办?它肯定会添加id,但也可能添加其他内容,如时间戳.在我不返回整个资源的情况下,最好是进行POST,返回id,然后让客户端执行GET以获取新资源.
我有一个简单的User $资源,使用默认的$ http缓存实现,如下所示:
factory('User', function($resource){
return $resource(endpoint + '/user/current/:projectId', {},
{get:
{
cache: true,
method: 'GET'
}
}
);
})
Run Code Online (Sandbox Code Playgroud)
这非常有效,即我的服务器只在我的应用程序中调用一次,然后从缓存中获取值.
但是我需要在某个操作后刷新服务器的值.有一个简单的方法吗?
谢谢.
在大多数情况下,<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对象
有没有办法直接扩展用于实例化列表中对象的基类?
谢谢!
我有一个像这样的角度资源
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?
假设我有一个这样的资源设置:
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)
有什么方法可以阻止type和id作为请求体的一部分提交,只是发送namePUT有效载荷?我不控制我提交的API,它似乎不喜欢我发送它的额外参数.
谢谢!
更新 - 2013年10月25日 - 13:38
资源文档说:
如果参数值以@为前缀,则从数据对象中提取该参数的值(对非GET操作很有用).
这意味着这应该从数据中删除参数:
resource.save({type:'@user', id:'@14', name:'Bob Dole'});
Run Code Online (Sandbox Code Playgroud)
但它似乎没有用.还是不知所措.
我正在使用$ 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中了还是我需要自己实现它?
我有一个模型,定义使用$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)
我定义了一个Preference为Preference对象添加有价值方法的工厂.但是当用户加载时,这些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?
我的学生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
有没有办法做到这一点?
我正在使用一个小型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.
如何从$资源获得空响应?
我正在运行这个:
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.