我有这样的服务:
.factory('Car', function(Restangular) {
var baseCars = Restangular.all('cars');
Restangular.extendModel('cars', function(obj) {
obj.extraMethod = function() { console.log('method added'); };
return obj;
});
return {
show: function(id) {
return baseCars.one(id).get();
}
};
});
Run Code Online (Sandbox Code Playgroud)
和这样的控制器:
.controller('CarCtrl', function ($scope, $stateParams, Car) {
Car.show($stateParams.id).then(function(car) {
$scope.car = car;
$scope.car.extraMethod();
});
});
Run Code Online (Sandbox Code Playgroud)
但是,这会导致undefined is not a function错误$scope.car.newMethod().
有谁知道这是为什么以及如何让它工作?
官方的restangular文档提供此代码示例以在ErrorInterceptor中重试请求:
var refreshAccesstoken = function() {
var deferred = $q.defer();
// Refresh access-token logic
return deferred.promise;
};
Restangular.setErrorInterceptor(function(response, deferred, responseHandler) {
if(response.status === 403) {
refreshAccesstoken().then(function() {
// Repeat the request and then call the handlers the usual way.
$http(response.config).then(responseHandler, deferred.reject);
// Be aware that no request interceptors are called this way.
});
return false; // error handled
}
return true; // error not handled
});
Run Code Online (Sandbox Code Playgroud)
但是,正如它在评论中所说,第二次尝试不会触发任何拦截器,因为它直接使用$ http.
有没有办法让第二个请求也通过Restangular管道并执行ErrorInterceptor?
我在一个带有post的restangular集合中插入一个模型
var collectionService = restAngular.all('collection');
var collection = collectionService.getList();
var item = {
title : "A title"
};
collection.post(item);
Run Code Online (Sandbox Code Playgroud)
现在我可以做而不是最后一个声明:
collection.post(item).then(function(newItem) {
collection.push(newItem);
});
Run Code Online (Sandbox Code Playgroud)
为什么插入的模型默认不插入集合中?是否有一个原因?我错过了一个电话或什么的?我想在插入模型后再次避免再次获取集合
我是否需要对会话/身份验证做一些特别的事情?我通过restangular post方法登录后,我的服务器无法看到我的会话.登录成功,但之后服务器上没有看到任何会话.如果我在正常的帖子外面登录,然后尝试请求页面,它工作正常.我还注意到chrome正在标题中发送以下内容:
Cookie:_rexbro_session=g2wAAAABaAJkAAxjdXJyZW50X3VzZXJhAmo=--E0687A67DBE48DA40B6957CBCF6E83FB0E612660
Run Code Online (Sandbox Code Playgroud)
这不是通过restangular请求发送的.
我还要提一下,当我通过restangular登录时,服务器正在响应以下标头:
set-cookie:_rexbro_session=g2wAAAACaAJkAAxjdXJyZW50X3VzZXJhAmgCZAAEdXNlcmgIZAASRWxpeGlyLlVzZXIuRW50aXR5ZAALRWxpeGlyLlVzZXJhAm0AAAASYXZvaWRpYW1AZ21haWwuY29tbQAAAA1KYXlzb24gQmFpbGV5bQAAADwkMmEkMTAkNHNsQVFFRGRDcXd1R3JNNVYwOXBTLkx3MHpVeElNLy5tbVM2eTVmc3BFa3NUbHhuTUtiMzJoB2QAFEVsaXhpci5FY3RvLkRhdGVUaW1lYgAAB91hBGEcYRFhD2EUaAdkABRFbGl4aXIuRWN0by5EYXRlVGltZWIAAAfdYQVhA2EVYR5hFmo=--D3F8D9A8355421B8571DB691ED5C082AD183B034; path=/; HttpOnly
Run Code Online (Sandbox Code Playgroud)
但我没有看到任何事情.
提前致谢.
编辑:我应该说我的服务器存储会话,api服务器,是与服务前端的服务器分开.
假设一个应用程序使用暴露分页集合的REST api中的数据,并且集合中的项目数量可能无限大(即,一次获取所有项目并存储在浏览器会话中的项目太多).
什么是获取,缓存和使这些数据的缓存无效的好策略?
说,API就像,
GET /users?page=1&per_page=50
Run Code Online (Sandbox Code Playgroud)
使用如下响应(即包括收集数据+分页元数据)
{
"paging": {
"per_page": 20,
"page": 1,
"previous": null,
"self": "/api/v1/users?per_page=20&page=1",
"next": "/api/v1/users?per_page=20&page=2"
},
"data": [
// first 20 users
]
}
Run Code Online (Sandbox Code Playgroud)
客户端可能会也可能不会在连续页面中加载集合,一次一页.任何客户端都可以更改集合中的用户.最终的一致性就足够了,我现在并不关心写冲突.
问题是在angularjs应用程序的上下文中,但是是一般的场景.
我最近开始学习angularjs使用restangular与我的restfull API(sails)交谈.我偶然发现的问题是,在更改范围中的列表后,ng-repeat不会更新.
控制器:
app.controller('UsersCtrl', ['UsersSvc', '$scope', function(UsersSvc, s) {
UsersSvc.getList().then(function (new_users) {
s.users = new_users;
})
s.destroy = function (user) {
user.remove().then(function () {
s.users = _.without(s.users, user);
});
}
}]);
Run Code Online (Sandbox Code Playgroud)
服务:
app.factory('UsersSvc', function(Restangular) {
return Restangular.all('users');
});
Run Code Online (Sandbox Code Playgroud)
模板:
<div ng-controller="UsersCtrl">
...
<tr ng-repeat"user in users">
<td>{{user.firstName}}</td>
<td>{{user.lastName}} </td>
<td>{{user.emailAddress}}</td>
<td>{{user.age}}</td>
</tr>
...
</div>
Run Code Online (Sandbox Code Playgroud)
当我检查范围时,restangular对象数组被正确地分配给用户控制器的范围,但模板拒绝更新.
提前致谢
目标
我正在尝试创建一系列承诺"增强器",它们将围绕现有的承诺(简单的http请求)添加功能(如缓存,排队,重定向处理等).
问题
我正在通过这种增强承诺的方法遇到的问题是,如果增强功能将任何功能或公共可访问的属性添加到承诺中(或者如果我正在包装已经增强的承诺,例如一个重复的请求),那么当我通过返回一个新的包装它在一个新的承诺$q.
题
我可以使用什么模式来增强或包装承诺(如下面的两个示例中所示),但不会丢失承诺可能具有的任何其他(非冲突)增强功能?
例1
这是一个自动处理503-Retry-After错误的示例:
function _enhancePromiseWithAutoRetry(promise) {
var enhancedPromise = $q(function(resolve, reject) {
var newReject = get503Handler(this, resolve, reject);
promise.then(resolve, newReject);
});
// 503 handling isn't enabled until the user calls this function.
enhancedPromise.withAutoRetry = function(onRetry, timeout) {
var newPromise = angular.copy(this);
newPromise._503handled = true;
newPromise._503onRetry = onRetry;
newPromise._503timeout = timeout;
return newPromise;
};
return enhancedPromise;
}
Run Code Online (Sandbox Code Playgroud)
我的想法是,如果我返回使用上述功能增强的承诺,用户可以:
someRequest.withAutoRetry().then(onSuccess, onError);
Run Code Online (Sandbox Code Playgroud)
或者更清楚(带链接):
someRequest.then(onSuccess, onAnyError)
.withAutoRetry().then(onSuccess, onNon503Error);
Run Code Online (Sandbox Code Playgroud)
这里,then(...)如果服务器繁忙,第一次调用可能会立即出错,但之后的调用.withAutoRetry()会在重复请求之前轮询服务器,直到响应成功,或者RetryAfter返回非错误.
例2
这是另一个添加自定义缓存行为的示例: …
我的应用程序存在CORS问题.
我的堆栈是带有Express 4的 Node.js 和使用Restangular的 AngularJS
我已经尝试过一些东西(例如),但我一直在努力:
XMLHttpRequest cannot load http://localhost:8080/api/users. Request header field Content-Type is not allowed by Access-Control-Allow-Headers.
Run Code Online (Sandbox Code Playgroud)
在服务器端,我有这个标题:
app.all('/*', function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.header("Access-Control-Allow-Methods", "GET, POST","PUT");
next();
});
Run Code Online (Sandbox Code Playgroud)
在AngularJS部分我使用这个:
$httpProvider.defaults.useXDomain = true;
delete $httpProvider.defaults.headers.common['X-Requested-With'];
Run Code Online (Sandbox Code Playgroud)
而我正在使用Restangular这样做:
var baseUsers = Restangular.all('users');
....
....
baseUsers.post(newUser).then(function(user){
console.log(user);
});
Run Code Online (Sandbox Code Playgroud)
还有一件事,在Node.js服务器中,我正在安慰req.method它OPTIONS,它说,我真的不知道为什么.
也许是傻事,希望有人可以帮助我.
谢谢!
在Restangular中,如果我声明一个服务,并执行PUT/PATCH/POST操作,它默认使用项目的id作为主键.但是,如果我们想使用自定义密钥呢?像slu or还是数字?
// GET to /users
Users.getList().then(function(users) {
var user = users[0]; // user === {id: 1, number: 123456, name: "Tonto"}
user.name = "Gonto";
// PUT to /users/1 <-- Here the id is used. But I'd like to use number to post to PUT to /users/123456
user.put();
})
Run Code Online (Sandbox Code Playgroud) 我在Main.js中使用查询参数"advertiserId"设置API基本URL.我想删除advertiserIdDemo.js 中的查询参数.注意我不想使用$location搜索参数(因为它们是来自当前窗口URL的搜索参数而不是我构建的URL).
Main.js:
Restangular.setBaseUrl("localhost:9000/advertisers");
Restangular.setDefaultRequestParams({
"advertiserId": advertiserID
});
Run Code Online (Sandbox Code Playgroud)
Demo.js
Restangular.RemoveRequestParams({
"advertiserId": advertiserID
});
Run Code Online (Sandbox Code Playgroud) angularjs ×10
restangular ×10
javascript ×3
node.js ×2
api ×1
caching ×1
express ×1
promise ×1
rest ×1
sails.js ×1