从指令中调用 angularjs watch 中的 $http
Calling $http inside angularjs watch from a directive
我正在尝试从我的指令中的手表内部调用 $http 服务。假设指令被放置在多个输入元素上。如果所有元素的值一起改变,watch 会背对背触发并且 $http 也会被背对背调用,有时会弄乱每个 $http 调用的响应,即连续的 $http 调用,即使输入不同反应是一样的。为这种情况构建代码的正确方法是什么?我可以使用 promise 来解决这个问题吗?如果是,那么如何,考虑到这是相同的 $http 调用,使用不同的输入进行调用。
Utils.directive('setDescription', function ($q,$http,$timeout) {
var directive = {};
directive.priority = 1;
directive.restrict = 'A';
directive.require = 'ngModel';
directive.link = function(scope,element,attributes,ngModel) {
scope.isInput = false;
scope.getDescription = true;
scope.elementArray = [];
element.bind("keypress", function (event) {
scope.isInput = true;
return true;
});
scope.$watch(function(){
var codeElem = element.next();
if(codeElem[0]!=undefined){
codeElem=codeElem[0];
}
return scope.gettheObject(codeElem.name,scope);
},function(newValue,oldValue){
if(!scope.isInput && scope.getDescription){
if(newValue!=undefined && (newValue.trim())!=""){
$timeout(function() {
element.val(newValue);
scope.elementArray.push(element);
$http({
method: 'POST',
url: Constants.BASE_REST_URL + '/picklist/pickListResultGeneric',
data : CryptoHelperService.getEncryptedData(searchstr,true),
headers: CryptoHelperService.getEncryptionHeaders(),
cache: false,
xsrfCookieName : 'nicAccessCookie'
}).then(function(response) {
response.data = CryptoHelperService.getDecryptedResponse(response.data,response.headers);
});
});
}
}
});
}
return directive;
});
借助 promise 解决。使用 $q.when()
(与 $q.resolve()
相同),创建一个立即用给定值解决的承诺。对于数组中的每个元素,构建 $http
调用并将其添加到承诺链中。遍历所有元素后,将按照它们在链中添加的相同顺序调用每个调用。
var promiseChain = $q.when();
scope.elementArray.forEach(function(elem) {
//Initiate a chain of promises for each REST call
promiseChain = promiseChain.then(function() {
return $http({
method: 'POST',
url: someURL,
data : someData
});
});
//Each promise in the chain is then resolved individually in the order in which they were invoked.
promiseChain.then(function(response) {
//do stuff here after each call returns individually
});
});
我正在尝试从我的指令中的手表内部调用 $http 服务。假设指令被放置在多个输入元素上。如果所有元素的值一起改变,watch 会背对背触发并且 $http 也会被背对背调用,有时会弄乱每个 $http 调用的响应,即连续的 $http 调用,即使输入不同反应是一样的。为这种情况构建代码的正确方法是什么?我可以使用 promise 来解决这个问题吗?如果是,那么如何,考虑到这是相同的 $http 调用,使用不同的输入进行调用。
Utils.directive('setDescription', function ($q,$http,$timeout) {
var directive = {};
directive.priority = 1;
directive.restrict = 'A';
directive.require = 'ngModel';
directive.link = function(scope,element,attributes,ngModel) {
scope.isInput = false;
scope.getDescription = true;
scope.elementArray = [];
element.bind("keypress", function (event) {
scope.isInput = true;
return true;
});
scope.$watch(function(){
var codeElem = element.next();
if(codeElem[0]!=undefined){
codeElem=codeElem[0];
}
return scope.gettheObject(codeElem.name,scope);
},function(newValue,oldValue){
if(!scope.isInput && scope.getDescription){
if(newValue!=undefined && (newValue.trim())!=""){
$timeout(function() {
element.val(newValue);
scope.elementArray.push(element);
$http({
method: 'POST',
url: Constants.BASE_REST_URL + '/picklist/pickListResultGeneric',
data : CryptoHelperService.getEncryptedData(searchstr,true),
headers: CryptoHelperService.getEncryptionHeaders(),
cache: false,
xsrfCookieName : 'nicAccessCookie'
}).then(function(response) {
response.data = CryptoHelperService.getDecryptedResponse(response.data,response.headers);
});
});
}
}
});
}
return directive;
});
借助 promise 解决。使用 $q.when()
(与 $q.resolve()
相同),创建一个立即用给定值解决的承诺。对于数组中的每个元素,构建 $http
调用并将其添加到承诺链中。遍历所有元素后,将按照它们在链中添加的相同顺序调用每个调用。
var promiseChain = $q.when();
scope.elementArray.forEach(function(elem) {
//Initiate a chain of promises for each REST call
promiseChain = promiseChain.then(function() {
return $http({
method: 'POST',
url: someURL,
data : someData
});
});
//Each promise in the chain is then resolved individually in the order in which they were invoked.
promiseChain.then(function(response) {
//do stuff here after each call returns individually
});
});