使用Restangular成功请求后,如何访问HTTP响应状态代码?
Restangular.all('orders').getList().then (result) ->
console.log result # no status code
console.log 'Preferably, status code should be here: ', result.status
, (error) ->
console.log 'Error status code: ', error.status # this works
Run Code Online (Sandbox Code Playgroud)
我试图实现一个响应提取器来将其作为元数据添加,但状态代码在流入提取器时已被剥离.
我正在使用Django REST Framework来建模使用大量模型关系的REST API.
使用AngularJS和Restangular在前端级别解决这些关系的简单方法是什么?
这就是我的模型的一部分:
class Country( Model ):
name = CharField( max_length = 256 )
class City( Model ):
name = CharField( max_length = 256 )
postal_code = CharField( max_length = 16 )
country = ForeignKey( "Country" )
class Customer( Model ):
first_name = CharField( max_length = 256 )
last_name = CharField( max_length = 256 )
city = ForeignKey( "City" )
Run Code Online (Sandbox Code Playgroud)
以下JavaScript代码显示了我如何加载数据:(我实际上使用了返回的promises all(),但是$object为了解释这个而更短)
$scope.countries = [];
$scope.cities = [];
$scope.customers = [];
Restangular.all( …Run Code Online (Sandbox Code Playgroud) 我写了这个简单的彗星实现
var app = angular.module('App', ['restangular', 'Comet']);
app.config(function(RestangularProvider) {
//RestangularProvider.setBaseUrl('http://localhost/my-rest-api/api/v1/');
RestangularProvider.setBaseUrl('http://[private-ip]/my-rest-api/api/v1/');
RestangularProvider.setDefaultHttpFields({timeout: 60*60*24});
});
var comet = angular.module('Comet', []);
comet.factory('CometService', ['Restangular', function(Restangular){
var cometUrl = Restangular.all('comet');
var asteroid = function(cometUrl, callback){
cometUrl.post({user:"Username"}).then(function(data){
callback(data.plain());
asteroid(cometUrl,callback);
})
};
return {
getComet: function(callback){
asteroid(cometUrl,callback);
}
}
}]);
app.controller('Ctrl', ['$scope', 'CometService', function($scope, CometService){
function callback(data){
console.log(data);
}
CometService.getComet(callback);
}]);
Run Code Online (Sandbox Code Playgroud)
它在localhost中很好用,但是如果从其他主机调用该API则不能。如果我不使用矩形,则相同的代码也可以正常工作。该API是使用Phalcon框架用PHP编写的,并且设置了所有CORS标头。所有目录都具有777权限。如果我直接在Restangular.all(url)中使用http:// [private-ip] / my-rest-api / api / v1 / comet url,并且XMLHttpRequest(OPTION Angular.js 9827)是403错误被应用加上了这段代码。
我有一个服务(AuthService),我需要在我的restangularInit函数(在我的 app.module.ts 中)中访问它,但我不知道如何访问它,我无法访问它。
我试图将它移动到 AppModule 类中,但到那时它\xc2\xb4s 已经晚了。
\n\n调用服务功能,例如。getToken按预期工作。
import { BrowserModule } from \'@angular/platform-browser\';\nimport { NgModule } from \'@angular/core\';\nimport { FormsModule } from \'@angular/forms\';\nimport { HttpModule } from \'@angular/http\';\nimport { MaterialModule } from \'@angular/material\';\nimport { FlexLayoutModule } from "@angular/flex-layout";\nimport { RestangularModule } from \'ng2-restangular\';\n\n// Components\nimport { AppComponent } from \'./app.component\';\nimport { ProductComponent } from \'./components/product/product.component\';\n\n// Services\nimport { AuthService } from \'./services/auth.service\';\n\nexport function restangularInit(RestangularProvider, AuthService) {\n console.log(AuthService); // this is undefined\n let token = …Run Code Online (Sandbox Code Playgroud) 我正在学习Angular,我试图以这种方式包含Restangular:
var app = angular.module('myapp',['restangular']);
app.controller('UsersController', ['$scope', function ($scope, Restangular) {
...
Run Code Online (Sandbox Code Playgroud)
然后我像这样使用Restangular:
var data = Restangular.all('someurl');
Run Code Online (Sandbox Code Playgroud)
这里我得到一个错误:Restangular未定义.根据文档,这应该很简单:
// Add Restangular as a dependency to your app
angular.module('your-app', ['restangular']);
// Inject Restangular into your controller
angular.module('your-app').controller('MainCtrl', function($scope, Restangular) {
// ...
});
Run Code Online (Sandbox Code Playgroud)
但是我无法让它工作.是什么赋予了?
我想要完成的目标是在restAngular中做一个帖子.我一直在尝试下面的代码,但是我收到了一个带有customPost的状态代码400.这是我发送请求的URL ... http://localhost/api/api/index.php/auth/token/ [object%20Object].正如您所看到的,[object%20Object]正在添加gettting.我怎么摆脱这个?我应该在customPOST之外做另一种方法吗?为什么要添加这个?
var login = Restangular.one('auth/token').customPOST(
{grant_type:"password", username:"b@t.com",password:"666666",scope:"app"},{},{},
{Authorization:'Basic ' + client,
ContentType:'application/x-www-form-urlencoded'});
Run Code Online (Sandbox Code Playgroud) 我还是Angular的新手并承诺所以我希望我在这里有正确的想法.
我目前有一个数据层服务,它使用restangular来获取一些数据,然后返回一个promise,就像这样......
dataStore.getUsers = function (params) {
return users.getList(params);
};
Run Code Online (Sandbox Code Playgroud)
然后,我调用此函数的控制器会收到一个承诺,就像这样......
$dataStore.getUsers(params).then(function (response) {
$scope.users = response;
}, function(response) {
$log.error("Get users returned an error: ", response);
});
Run Code Online (Sandbox Code Playgroud)
这很好用,但我想在传回数据存储之前使用我的数据存储区内的promise.我想使用.then()方法检查它是否失败并进行一些日志记录,然后,从sucess函数和失败函数我想将原始的promise返回给我的控制器.
然后,我的控制器可以像现在一样使用.then()方法,事实上,我不希望我的控制器代码完全改变,只是我的数据存储区代码.
这里有一些半伪代码来显示我想要的数据存储功能...
dataStore.getUsers = function (params) {
users.getList(params).then(function (response) {
$log("server responded")
return original promise;
}, function(response) {
$log.error("server did not respond");
return original promise;
});
};
Run Code Online (Sandbox Code Playgroud) 当我在浏览器中调用put或customPUT检查请求主体时,将发送原始对象,而不是更新的对象.我检查了该RestAngular对象{{ object }},它是被更新.
这是控制器(APIUsers是一个RestAngular服务):
$scope.objects = {};
(function waitForNgInit(fnct) {
$scope.$watch('userID', function(newVal) {
if (newVal !== undefined) {
fnct();
}
});
})(function retrieveUser() {
$scope.objects.user = APIUsers.one($scope.userID).get().$object;
});
$scope.saveSettings = function() {
$scope.objects.user.customPUT($scope.objects.user).then(function(resp) {
$scope.errors = [];
}, function(err) {
console.log(err.data);
$scope.errors = err.data.errors;
});
};
Run Code Online (Sandbox Code Playgroud)
这是Jade(HTML模板代码):
div.user-settings.form-section(ng-controller="userSettingsFormController")
{{ objects }}
ul.error-box(ng-show="errors != undefined && errors.legnth != 0")
li(ng-repeat="error in errors") {{ error.msg }}
.form-group
label(for="username") …Run Code Online (Sandbox Code Playgroud) 我在AngularJS上使用Restangular返回一个对象(GPT对象是被返回的父对象),返回的数组对应于带有GPT的项目.
我可以在父GPT对象上执行所有Restangular"stuff",例如save()等.但是,当我在"projects"集合中获得对单个项目的引用时,我无法对其执行Restangular save().如何确保在主对象下面的集合中返回的所有项目都是"Restangularised",以便我可以对它们执行休息操作?即如果没有意义,我想我想要一个"深度Restangularisation"; - )...如果没有,我如何在尝试执行save()操作并为PUT/POST提供相关URL之前对一个实例进行Restangularize等等
希望这是有道理的.
问候
一世
在IE中,当我更新或销毁列表中的项目时,操作成功,但更新的列表/数据不会从服务器返回,因此列表未在视图中更新.
我试过以下无济于事:
angular.module('casemanagerApp')
.config(function($stateProvider, $urlRouterProvider, RestangularProvider) {
if (!RestangularProvider.setDefaultHeaders) {
RestangularProvider.setDefaultHeaders({});
}
RestangularProvider.setDefaultHeaders({'If-Modified-Since': 'Mon, 26 Jul 1997 05:00:00 GMT'});
RestangularProvider.setDefaultHeaders({'Cache-Control': 'no-cache'});
RestangularProvider.setDefaultHeaders({'Pragma': 'no-cache'});
$stateProvider
...
});
Run Code Online (Sandbox Code Playgroud)
有人能指出我正确的解决方案吗?
restangular ×10
angularjs ×8
javascript ×3
rest ×2
angular ×1
coffeescript ×1
django ×1
phalcon ×1
php ×1
promise ×1