请参阅此处接受的答案,以获得有关transFormRequest函数/数组的相当好的解释.
在答案的最后一个例子中:
var transform = function(data){
return $.param(data);
}
$http.post("/foo/bar", requestData, {
headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'},
transformRequest: transform
}).success(function(responseData) {
//do stuff with response
});
Run Code Online (Sandbox Code Playgroud)
但是,问题在于transformRequest: transform覆盖了Angular预先构建的函数数组.
来自Angular 文档:
要全局扩充或覆盖默认转换,请修改$ httpProvider.defaults.transformRequest和$ httpProvider.defaults.transformResponse属性.默认情况下,这些属性是一个转换函数数组,允许您将新转换函数推送或取消转换到转换链中.您还可以通过直接将转换函数分配给这些属性来决定完全覆盖任何默认转换,而无需使用数组包装器.这些默认值在运行时在$ http工厂上再次可用,如果您希望参与转换,则这可能很有用.
类似地,要在本地覆盖请求/响应转换,请扩充传递到$ http的配置对象的transformRequest和/或transformResponse属性.
如果我想全局应用我的转换函数,我会这样做
$httpProvider.defaults.transformRequest.unshift(myFunction)
Run Code Online (Sandbox Code Playgroud)
要么
$httpProvider.defaults.transformRequest.push(myFunction)
Run Code Online (Sandbox Code Playgroud)
我的问题
而不是删除整个转换请求函数数组,如何将另一个转换函数推送到一个调用,而不是全局?
在我们的内部angularjs项目中,其中一个服务有$http.head()我正在尝试测试的调用.
为了测试,我正在使用由提供的Fake HTTP后端angular-mocks.这是相关代码:
it('handle status code 200', inject(function ($httpBackend, ConnectionService) {
spyOn(Math, 'random').andReturn(0.1234);
httpBackend = $httpBackend;
httpBackend.expectHEAD('ping?rand=1234').respond(200);
ConnectionService.sendRequest();
httpBackend.flush();
expect(ConnectionService.stats.packetsReceived).toEqual(5);
httpBackend.verifyNoOutstandingExpectation();
httpBackend.verifyNoOutstandingRequest();
}));
Run Code Online (Sandbox Code Playgroud)
将测试结果运行到以下错误中:
PhantomJS 1.9.7 (Mac OS X) connection service tests sendRequest function handle status code 200
FAILED TypeError: 'undefined' is not a function (evaluating 'httpBackend.expectHEAD('ping?rand=1234')')
at /path/to/app/app-connection-service_test.js:66
at d (/path/to/app/bower_components/angular/angular.min.js:35)
at workFn (/path/to/app/bower_components/angular-mocks/angular-mocks.js:2159)
Run Code Online (Sandbox Code Playgroud)
经过一番挖掘后,我发现了相关的github问题:
据我所知,这意味着expectHEAD()在角度模拟中确实没有方法 - 它已被记录,但实际上,它还不是稳定角度释放的一部分.
什么是最好的方法?
请注意,我必须保持angular <= 1.2,因为此应用程序需要在IE8上运行(Angular 1.3正在放弃对IE8的支持).
我正在考虑的一个解决方法是替换head()为get().在这种情况下,我可以用现有 …
我想对我的服务器进行真正的调用进行集成测试,所以,我不想使用angular-mocks的$ httpBackend模块,所以我试试这个:
beforeEach(inject(function($rootScope,_MembersDataSvc_){
service = _MembersDataSvc_;
}));
it('test',function(done){
service.me().then(function(){done();});
});
Run Code Online (Sandbox Code Playgroud)
服务是:
function me() {
return $http
.get('urlBase/me')
.then(meSuccess);
function meSuccess(response) {
return response.data.members[0];
}
}
Run Code Online (Sandbox Code Playgroud)
这从来没有调用$ http,似乎angular-mocks覆盖了$ http服务从未拨打过电话.
一些想法?
编辑1:
根据这篇文章:http://base2.io/2013/10/29/conditionally-mock-http-backend/
你可以为那些你不想模拟的$ http调用做一个passThrough,所以你试试这个:
var service;
var scope;
var $httpBackend;
beforeEach(inject(function($rootScope,_MembersDataSvc_,_$httpBackend_){
service = _MembersDataSvc_;
scope = $rootScope.$new();
$httpBackend = _$httpBackend_;
}));
it('test',function(done){
//this.timeout(10000);
$httpBackend.whenGET(/views\/\w+.*/).passThrough();
$httpBackend.whenGET(/^\w+.*/).passThrough();
$httpBackend.whenPOST(/^\w+.*/).passThrough();
service.me().then(function(response){console.log(response);done();});
scope.$apply();
//service.getDevices(member).then(function(response){console.log(response);done();})
});
Run Code Online (Sandbox Code Playgroud)
但是passThrough在这里是未定义的.
编辑2:
我读过这篇文章:http://blog.xebia.com/2014/03/08/angularjs-e2e-testing-using-ngmocke2e/,但我认为这是一个独立的测试??,我想用业力和茉莉花.
这是我的全部测试.
describe('integration test', function () {
beforeEach(function () {
module('MyAngularApp');
});
var service; …Run Code Online (Sandbox Code Playgroud) 我对整个AngularJS世界以及它是如何工作都很陌生,但是我很难让它按预期工作.我知道它与我使用的方式有关,$http.get()并试图将变量分配回我的控制器,但我无法弄明白.
使用$scope而不是this我可以使它工作,但如果可能的话,我更喜欢使用this所以我可以使用"控制器作为"
码:
app.controller('ctrlSuppliers', function($http){
this.supplierList = {};
$http.get("http://some_url_here")
.success(function(response) { this.supplierList = response.records;})
.error(function() { this.supplierList = [{supplier_id: 0, supplier_name: 'Error Getting Details'}];});
});
Run Code Online (Sandbox Code Playgroud)
从这个例子中,我无法$http.get从supplierListHTML页面内部访问请求中的{{ supplier.supplierList[0].supplier_name }}任何结果(即不显示任何结果)
我知道如果我将控制器更改为$scope可以访问该数据(虽然不使用与上面相同的格式),并且我也知道通过console.log(this.supplierList)在.success调用中使用来填充数据.
我也知道它不工作的原因是因为this从控制器内到$http.get调用内的变化的上下文.
所以我的问题是:如何使用this而不是使用$ http.xxx调用来访问结果scope?我已经阅读了一些不同的消息来源,但大多数人都在谈论使用$scope和承诺.我没有发现任何封面使用this(或声明它var supplier = this).任何帮助将非常感激.
谢谢,
我使用ui-grid绑定来自Role Table的数据,其中包含Department Id作为PrimaryKey.我正在调用Web Api来获取表中的所有角色并以ui-grid显示.
部门表
角色表
我真正的问题是,当我使用cellFilter绑定到网格时,我想将部门ID转换为部门名称,这就是为什么我声明objMapping以使用部门名称映射部门ID.但是每当我运行时,我都会看到在设置objMapping之前调用了cellFilter自定义函数,即'mapDepartmentName',而且我也无法在'mapDepartmentName'中引用objMapping.
我的网格看起来像这样: -
但是当我编辑时,我得到的结果如下,这是绝对正确的: -
我的代码片段如下: -
var myApp = angular.module('appHome', ['ui.grid', 'ui.grid.edit']);
myApp.controller("ctrlRole", ['$scope', 'MetadataOrgFactory', function ($scope, MetadataOrgFactory) {
var arrDepts = [];
var objMapping = {};
MetadataOrgFactory.getApiCall('getpublisheddepts', function (dataSuccess) {
$scope.department = dataSuccess;
for (var cntElem = 0; cntElem < dataSuccess.length; cntElem++) {
var objDept = { id: dataSuccess[cntElem].DeptId, DeptId: dataSuccess[cntElem].DeptName }
arrDepts.push(objDept);
objMapping[dataSuccess[cntElem].DeptId] = dataSuccess[cntElem].DeptName;
}
$scope.gridRole.columnDefs[1].editDropdownOptionsArray = arrDepts;
}, function (dataError) {
});
$scope.gridRole = {
data: 'roleData',
columnDefs: [ …Run Code Online (Sandbox Code Playgroud)是否可以仅为指定的域设置标头?
执行此操作的"正常"方式为所有调用添加了标头,甚至是例如检索HTML模板的调用.
$http.defaults.headers.common['Authorization']='...';
Run Code Online (Sandbox Code Playgroud)
到目前为止,除了使用$ http拦截器之外,我看不到任何其他方式,但如果你能想到一个,我很好奇.
谢谢.
我已经选择了一个项目,我正在尝试将一些数据从服务返回到我的控制器.我已经在这里待了大约12个小时,并尝试了不同的方法.它们通常都会产生同样的"缺失数据".
我试过了
$http.get右侧放在控制器内而不使用promises我觉得我现在所拥有的是一个简单的,因为我可以得到它,而我所读到的一切都说这应该有效
这些链接就是从今天开始的.
我认为可能存在$ scope问题,因为过去我已经看到$ scopes在使用多个控制器时没有获取数据,但是该站点只是在index.html中声明一个控制器作为<body ng-app="myApp" ng-controller="BodyCtrl">设置.主app.js使用状态(我认为来自ui-router)就像这样......
.state('app.view', {
url: '/view',
templateUrl: 'views/view.tpl.html',
controller: 'MyCtrl'
})
Run Code Online (Sandbox Code Playgroud)
将控制器连接到不同的页面.此外,该网站还有一些其他控制器从服务中获取数据,我首先将其作为模板查看,然而,数据和返回比我想要的更复杂.但最重要的是,控制器正在访问服务提供的数据.他们都使用$ resource,这就是我从这个问题开始的方式.我坚持使用$ http因为它应该可以工作,而且我希望在我进入"更高级别"的东西之前使用它.另外,我只需要从端点获取GET,所以觉得$ resource太过分了.
服务
.factory('MyService', ['$http', '$q', '$rootScope', function ($http, $q, $rootScope) {
var defer = $q.defer();
var factory = {};
factory.all = function () {
$http({method: 'GET', url: 'http://URLtoJSONEndpoint'}). …Run Code Online (Sandbox Code Playgroud) angularjs angularjs-service angularjs-scope angularjs-controller angularjs-http
我最近在 AngularJS 中做了很多编码。一段时间后,它开始对它感到满意,并且也变得非常高效。但不幸的是,有一件事我不明白:
在我的项目中,我需要通过 $http.get 和 RESTful API 服务器获取数据。这是我首先开始绊倒的地方。在处理需要继续的数据的函数中实现 promise($q.defer 等和 .then)后,我想我已经解决了这个问题。
但在这段代码中:
$scope.getObservationsByLocations = function() {
var promise = $q.defer();
var locationCount = 0;
angular.forEach($scope.analysisData, function(loc) { // for each location
$http.get($scope.api + 'Device?_format=json', { // get all devices
params: {
location: loc.location.id
}
}).then(function (resultDevices) {
var data = angular.fromJson(resultDevices);
promise.resolve(data);
// for each device in this location
angular.forEach(angular.fromJson(resultDevices).data.entry.map(function (dev) {
http.get($scope.api + 'Observation?_format=json', { // get all observations
params: {
device: dev.resource.id
}
}).then(function (resultObservations) {
var …Run Code Online (Sandbox Code Playgroud) 可能是一个非常基本的问题,但我似乎无法找到一个简单的答案.
我有一个利用Angular的GET方法$http,它从特定的url(URL_OF_INTEREST)请求一个promise .
在此服务器上,我运行一个server.js可以处理GET请求的快速脚本脚本.
server.js
var express = require('express'); // call express
var app = express(); // define our app using express
var bodyParser = require('body-parser');
var stripe = require("stripe")("CUSTOM_TEST_TOKEN");
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
var port = process.env.PORT || 8080;
var router = express.Router(); // get an instance of the express Router
router.get('/', function(req, res, next) {
var stripeToken = "CUSTOM_PAYMENT_TOKEN";
var charge = stripe.charges.create({
amount: 1100, // amount in cents, again
currency: …Run Code Online (Sandbox Code Playgroud) 我已经阅读了所有帖子,其中人们得到这个问题,其中$ http不是一个函数,并且看起来大多数情况下它是由于以错误的顺序进行注入.
我的模块定义如下所示:
angular.module("app", []).controller("appCtrl", ['$scope','$http',
function ($scope, $http) {
...
$scope.makeCall= function ($http) {
console.log("HERE");
$http({ method: 'GET', url: <url }).
then(function (response) {
console.log(response.data);
return response.data;
}, function (response) {
});
};
}
])
Run Code Online (Sandbox Code Playgroud)
任何建议将不胜感激.
javascript promise angularjs angularjs-controller angularjs-http