Я новичок в AngularJS и имею следующий код, который мне нужно отредактировать.
scope.findData = [];
scope.clientId;
scope.identityDocuments_a = [];
scope.getClientIdentityDocuments_a = function(clientID){
resourceFactory.clientResource.getAllClientDocuments({clientId: clientID, anotherresource: 'identifiers'}, function(data){
scope.identityDocuments_a = data;
});
};
scope.findOptions = function(value){
var i;
var deferred = $q.defer();
resourceFactory.clientResource.getAllClientsWithoutLimit({displayName: value, orderBy : 'id', officeId : scope.group.officeId, sortOrder : 'ASC', orphansOnly : true}, function (data) {
deferred.resolve(data.pageItems);
for (i = 0; i <= data.pageItems.length; i++) {
scope.clientId = data.pageItems[i].id;
scope.getClientIdentityDocuments_a(scope.clientId);
//<- I want to access scope.identityDocuments_a here
}
scope.findData = data.pageItems;
});
return deferred.promise;
};
Обе эти функции находятся под одним и тем же контроллером. Я просмотрел переменную Accessing $ scope из другого метода в том же контроллере Angularjs, но он, похоже, не работает. Где я иду не так? Заранее спасибо.
Хорошо, я вижу проблему. Ваш getClientIdentityDocuments_a() использует функцию обратного вызова. Асинхронное извлечение данных происходит отдельно, поэтому значение не устанавливается к тому моменту, когда вы хотите его использовать. Вы можете исправить это, вернув обещание
scope.getClientIdentityDocuments_a = function(clientID){
var defer = $q.defer();
resourceFactory.clientResource.getAllClientDocuments(
{clientId: clientID,
anotherresource: 'identifiers'}, function(data){
scope.identityDocuments_a = data;
defer.resolve(data);
});
return defer.promise;
};
а затем, чтобы использовать данные во второй функции:
scope.getClientIdentityDocuments_a(scope.clientId).then(function(documents) {
// at this point, the scope.identityDocuments_a should be available,
// but you could just set it here, since the document variable is
// returning the same thing
console.dir(scope.identityDocuments_a) // should have the returned data
console.dir(documents) // should be the same as above
});
// Here, the documents will NOT be available, because this executes before
// the promise is resolved
console.dir(scope.identityDocuments_a) // [] or undefined
ОБНОВЛЕНИЕ: Чтобы уточнить, если в getClientIdentityDocuments_a вы должны были напрямую назначить переменную, например
scope.getClientIdentityDocuments_a = function(clientID){
scope.identityDocuments_a = some_document;
};
Вам не понадобится обещание, и ваш код будет работать. Но поскольку вы извлекаете данные из асинхронного источника, вторая функция пытается использовать данные до того, как значение будет установлено.
.then()
может использоваться с любым обещанием вместо синтаксиса обратного вызова, и он просто ожидает, пока обещание не будет разрешено (в данном случае defer.resolve()
), прежде чем оно выполнится.
clientId: scope.clientID