我希望能够判断用户是否修改了$ resource实例 - 也就是说,它的当前状态是否与最初从服务器加载的状态不同&&尚未保存.我怎样才能做到这一点?
我愿意检索资源请求的响应头,因为我在其中放入了分页信息和其他内容而不是响应主体,以使REST api清晰.
虽然我们可以从成功/错误回调中获取它,如下所示:
Object.get({type:'foo'}, function(value, responseHeaders){
var headers = responseHeaders();
});
Run Code Online (Sandbox Code Playgroud)
'Object'是我的资源工厂服务.
此外,当我尝试在解决所需资源后更改路由时,我尝试过:
.when('/list', {
templateUrl: 'partials/list.html',
controller: 'ListCtrl',
// wait for the required promises to be resolved before controller is instantialized
resolve: {
objects: ['Object', '$route', function(Object, $route){
return Object.query($route.current.params).$promise;
}]
}
})
Run Code Online (Sandbox Code Playgroud)
并且在控制器中,只需注入"对象"而不是对象服务,因为它已经解析并填充了真实数据.
但是当我尝试从控制器中的"对象"获取头信息时,我遇到了问题.
我试过了objects.$promise.then(function(data, responseHeaders){}),但是responseHeader是未定义的.
如何更改$ resource服务的行为,以便将responseHeader getter抛出到$ promise then()回调函数中?
我的服务"对象"供参考:
myServices.factory('Object', ['$resource',
function($resource){
return $resource('object/:id', {id: '@id'}, {
update: {method: 'PUT'},
});
}
]);
Run Code Online (Sandbox Code Playgroud) 我试图使用来自自定义服务的数据从角度$ resource中装饰返回的数据.我的代码是:
angular.module('yoApp')
.service('ServerStatus', ['$resource', 'ServerConfig', function($resource, ServerConfig) {
var mixinConfig = function(data, ServerConfig) {
for ( var i = 0; i < data.servers.length; i++) {
var cfg = ServerConfig.get({server: data.servers[i].name});
if (cfg) {
data.servers[i].cfg = cfg;
}
}
return data;
};
return $resource('/service/server/:server', {server: '@server'}, {
query: {
method: 'GET',
isArray: true,
transformResponse: function(data, header) {
return mixinConfig(angular.fromJson(data), ServerConfig);
}
},
get: {
method: 'GET',
isArray: false,
transformResponse: function(data, header) {
var cfg = ServerConfig.get({server: 'localhost'});
return mixinConfig(angular.fromJson(data), ServerConfig); …Run Code Online (Sandbox Code Playgroud) 我在AngularJS上编写了很少的资源来访问Tastypie API.一切都运行正常,除了细节:tastypie总是将实际结果封装在objectsJSON 的属性中,例如:
/api/v1/reminder/:
{
meta: {
limit: 20,
next: null,
offset: 0,
previous: null,
total_count: 3
},
objects: [{
category: {
color: "#999999",
id: 1,
name: "Groceries",
resource_uri: "/api/v1/category/1"
},
description: "",
due_date: "2010-10-16",
id: 1,
repeat: "weekly",
resource_uri: "/api/v1/reminder/1",
value: "-50"
}, {
category: {
color: "#999999",
id: 1,
name: "Groceries",
resource_uri: "/api/v1/category/1"
},
description: "",
due_date: "2010-10-17",
id: 2,
repeat: "weekly",
resource_uri: "/api/v1/reminder/2",
value: "-50"
}
}
Run Code Online (Sandbox Code Playgroud)
使用回调get()调用修复是很糟糕的:
Reminder.get().$then(function (result) {
$scope.reminders …Run Code Online (Sandbox Code Playgroud) 我已经建立了一个带有两个参数的分页指令; 当前页面和总页数.
<pagination page="page" number-of-pages="numberOfPages"></pagination>
问题是我只会在AJAX调用之后知道numberOfPages的值(通过ng-resource).但是我的指令已经在AJAX调用完成之前呈现.
app.controller('MyController', function ($scope, $routeParams) {
$scope.page = +$routeParams.page || 1,
$scope.numberOfPages = 23; // This will work just fine
MyResource.query({
"page": $scope.page,
"per_page": 100
}, function (response) {
//This won't work since the directive is already rendered
$scope.numberOfPages = response.meta.number_of_pages;
});
});
Run Code Online (Sandbox Code Playgroud)
我更喜欢等待渲染我的控制器模板,直到AJAX调用完成.
当AJAX调用完成时,Plan B将使用指令模板附加模板.
我无法解决这两种情况.
我正在尝试访问我无法控制的REST服务.第一个问题是该服务不包含Access-Control-Allow-Origin标头,这是一个问题,如果我理解正确,立即限制我使用JSONP.
此外,默认情况下,此服务发送XML而不是JSON,但它能够发送JSON.我认为它应该响应我的Accept标头,负责服务的人说它看着我的Content-Type.这意味着我需要做一个POST而不是一个GET(虽然当我只是获取一些静态数据时更有意义,对吗?).
像我一样顽固,我正在尝试我的Accept标头.由于Angular只接受JSON,我希望它Accept: application/json默认使用标头,但它没有,它忽略了我手动设置它的尝试:
app.config(['$httpProvider', function($httpProvider){
console.log($httpProvider.defaults.headers.common);
delete $httpProvider.defaults.headers.common['X-Requested-With'];
$httpProvider.defaults.headers.post['Accept'] = 'application/json, text/javascript';
$httpProvider.defaults.headers.post['Content-Type'] = 'application/json; charset=utf-8';
$httpProvider.defaults.headers.post['Access-Control-Max-Age'] = '1728000';
$httpProvider.defaults.headers.common['Access-Control-Max-Age'] = '1728000';
$httpProvider.defaults.headers.common['Accept'] = 'application/json, text/javascript';
$httpProvider.defaults.headers.common['Content-Type'] = 'application/json; charset=utf-8';
$httpProvider.defaults.useXDomain = true;
}]);
Run Code Online (Sandbox Code Playgroud)
我在实际资源中再次这样做:
return $resource('http://foo.com/getStuff', {}, {
fetch: {
method:'JSONP',
params: params,
headers: {
'Accept':'application/json, text/javascript',
'Content-Type':'application/json; charset=utf-8'
},
isArray:false,
callback: 'JSON_CALLBACK'
}
});
Run Code Online (Sandbox Code Playgroud)
但是,请求标头仍然包含Accept: */*.
我的问题是:为什么?为什么Angular会忽略我的标题?我怎么能让它使用正确的标题呢?
而且:有没有办法在POST中使用JSONP?
编辑:最初我使用的是Angular 1.0.7,但我只是尝试了1.2.3并得到了相同的结果.标题被忽略,但每个人都声称这是实现目标的方法.
我也尝试直接使用$ http,而不是$ resource,使用相同的结果.
编辑2:这是一个JSFiddle.它是匿名的,并不使用我的真实服务器,但使用Firebug /开发人员工具,您可以验证它是否Accept: */*在两个调用上发送,尽管我尝试设置application/json …
我创建了从休息服务接收记录数的资源作为文本.Angular从回答中为每个字符组成一个数组.例如,如果休息答案20,angular将生成数组[2,0].我可以在不转换响应或使用的情况下修复它$http吗?
var resource = angular.module('resource');
resource.factory('RecordResource', ['$resource',
function($resource) {
return $resource('/rest/records/:id', {}, {
count: {
method:'GET',
url: "/rest/records/count",
isArray: false,
responseType: 'text'
}
}
}
]);
Run Code Online (Sandbox Code Playgroud) javascript arrays angularjs angularjs-service angularjs-resource
我有一个工厂,它返回我的文章模型的$资源:
angular.module('ADI.Resources').factory("Articles", ['$resource', function($resource) {
return $resource('/api/v1/article/:articleId', {
articleId: '@_id',
_shop: window.user._shop
}, {
update: {
method: 'PUT'
}
});
}]);
Run Code Online (Sandbox Code Playgroud)
GET,POST并且DELETE运行良好,但不是更新(PUT).这是我使用的代码:
Articles.update({articleId: '300000000000000000000001'}, function(article){
console.log(article);
});
Run Code Online (Sandbox Code Playgroud)
这是在提出这个要求:
PUT http://localhost:3000/api/v1/article?_shop=100000000000000000000001
Run Code Online (Sandbox Code Playgroud)
代替:
PUT http://localhost:3000/api/v1/article/300000000000000000000001?_shop=100000000000000000000001
Run Code Online (Sandbox Code Playgroud)
知道为什么在执行更新时没有填充:articleId参数?谢谢!
我正在使用AngularJS 1.2.1的ngResource,我试图null在PUT请求中作为参数发送值.不幸的是,当它被设置时,Angular将忽略它的参数而不发送它.
这是一些示例代码:
var User = $resource('/comments/:id', {id:'@id'}, {
destroy: { method: 'PUT', params: {content: null} }
});
var user = User.destroy({id:123}, function() {});
Run Code Online (Sandbox Code Playgroud)
Angular将忽略content而不发送密钥和null值.
如何让Angular发送null?
有什么选项可以解析ngResource响应中的嵌套资源?
关于在ngResource中解析嵌套资源的端点有一些相关的问题,但是这个问题是关于REST响应何时包含嵌套在正在查询的集合中的第二个资源,特别是你不会有的1对1映射例如pets/<id>/owner作为自己的资源.
假设有两种资源,Pets并且Owners:
GET /宠物:
[{
name: 'spark',
type: 'dog',
owner: '/owners/3/' # alternatively just '3' or the full object.
}]
Run Code Online (Sandbox Code Playgroud)
作为开发人员,我有时想要查询整个Owner资源,有时我想查询Pet资源然后我自动想要将owner属性解析为资源实例.
这是我目前的解决方案:
.factory('Pet', function ($resource, Owner) {
var Pet = $resource('/pets/:id', {id: '@id'});
Pet.prototype.getOwner = function () {
return new Owner(this.owner); // or Owner.get({id: this.owner})
}
return Pet;
})
Run Code Online (Sandbox Code Playgroud)
这里的问题很多.有诚信 - 一个人.我相信,这种实现允许同一资源的多个实例.那就是实用性.你也有额外的属性来跟踪(owner和getOwner(),而不是只owner;可能setOwner,如果你希望能够保存模型).
可以构建一个替代解决方案transformResponse,但是在每个具有嵌套映射的资源中都包含该解决方案.