Javascript AngularJS:工厂返回对象的正确方法?
我要在Angular.js项目中检索一个POST数据。这是我的工厂:Javascript AngularJS:工厂返回对象的正确方法?,javascript,angularjs,angularjs-factory,Javascript,Angularjs,Angularjs Factory,我要在Angular.js项目中检索一个POST数据。这是我的工厂: angular.module('mtApp').factory('getKey', function($http) { return { getData: function(data) { var key=''; return $http({ url: '../php/key_gen.php',
angular.module('mtApp').factory('getKey', function($http) {
return {
getData: function(data) {
var key='';
return $http({
url: '../php/key_gen.php',
method: "POST",
headers: {'Content-Type': 'application/json'}
}).success(function (data) {
console.log(data); //value is right as expected
return data;
})
.error(function (data, status, headers, config) {
console.log('Erro : ' + status + ' ' + headers);
});
}
}
});
我获取数据的方式是:
$scope.key = 'ok';
getKey.getData()
.success(function($scope,data){
$scope.key = data.GeneratedKey;
console.log(data.GeneratedKey); //undefined
console.log(data); //200 o.O
});
console.log($scope.key); //still 'ok' O.o
正如您在代码中看到的,我有几个console.log调用。当我运行应用程序时,我唯一看到的是:
mtapp.controller.js:13 ok
mtapp.app.js:52 Object {GeneratedKey: "d1bc7a5e840a6c24d87b90dde9e075de1f0e3b34978ca9f319…69d839b4e2a004e1f8d728939867afe189cfb8848c6a8ee38"}
mtapp.controller.js:9 undefined
mtapp.controller.js:10 200
行mtapp.app.js:52中的值应与mtapp.controller.js:10相同。但是当我尝试在日志中查看时,工厂中的对象只有200的值
我的目标是从工厂中的JSON(GeneratedKey)获取值,并将其传递给控制器(,在$scope.key中)
我做错了什么(因为您处理的是第二个参数,即状态代码,所以应该从中删除
$scope
,并使用数据本身
代码
getKey.getData()
.success(function(data, status, headers, config){ <---here $scope should remove
$scope.key = data.GeneratedKey;
console.log(data.GeneratedKey);
console.log(data);
});
getKey.getData()
.success(函数(数据、状态、标题、配置){尝试在工厂中使用$q
angular.module('mtApp').factory('getKey', function($http, $q) {
var getData= function(data) {
var key='';
var url = '../php/key_gen.php';
var returned = $http.post(url, data);
return $q.all(returned);
};
var getKey = {
getData: getData
};
return getKey;
});
$scope.key = 'ok';
getKey.getData(someData).then(function (response, status, headers, config) {
console.log(response.data.GeneratedKey);
});
正如Kevin所说,angular.js的主要问题是异步工作方式
最大的问题是最后一行
console.log($scope.key); //still 'ok' O.o
需要在调用工厂的函数结束之前进行设置。并且$scope已从函数中删除,以便正常工作,正如pankajparkar所说
$scope.key = 'ok';
getKey.getData()
.success(function(data){ // removed the $scope
$scope.key = data.GeneratedKey;
console.log($scope.key); //Moved up and it shows correctly in the console
... the rest of my code ...
});
我不知道这是否是最好的解决方案,但现在起作用了!:D为什么您接受成功回调的第一个参数为$scope?从您在工厂中使用的回调判断,您知道应该是数据…第二个参数是状态码。我应该是.success(函数(数据,$scope){
?.success(函数(数据,状态码){
还没有工作。行控制台.log($scope.key);//仍然是'ok'O.O
仍然只打印'ok'。它应该打印'ok'。ajax是异步的。太棒了!这就是问题所在。但我只是不知道为什么我会使用它。可能是错误地使用了一个示例:(@dipievil什么例子?你试过阅读文档吗?@KrzysztofSafjanowski这很简单,但仍然有问题。$scope.key='';getKey.getData().success(函数(数据){$scope.key=data.GeneratedKey;console.log(data.GeneratedKey);});console.log($scope.key)
$scope.key仍然为空。我想这就是我在调用中放入$scope的原因。@dipievil您不应该将$scope
传递给服务。我不知道为什么会发送someData。我想从工厂获取数据,而不是发送给工厂。删除它时,我遇到了错误类型错误:无法读取未定义的getData acc的属性“GeneratedKey”接受一个参数,即someData。您应该能够从response中获取生成的密钥。response.data在控制台中返回什么?这是一个反模式。没有理由仅为了再次包装而取消包装承诺。只需返回由$http.post(…)返回的承诺即可
someData
是一个变量?!如果你不需要getData中的参数,你需要在你的工厂中删除它。所以,是的,它是一个变量。你错过了Kevin说的部分。你是在说异步部分吗?这在你制作ajax时很明显?