AngularJs доступ к переменной области в другой функции

0

Я новичок в 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, но он, похоже, не работает. Где я иду не так? Заранее спасибо.

  • 0
    К какой переменной вы не можете получить доступ? ClientID в getClientIdentityDocuments_a ()? Если это проблема, попробуйте clientId: scope.clientID
  • 0
    Я не могу получить доступ к scope.identityDocuments_a. Я пробовал оповещение (scope.identityDocuments_a.toSource ()); и это только показало []
Теги:
angularjs-scope

1 ответ

1

Хорошо, я вижу проблему. Ваш 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;
};

Вам не понадобится обещание, и ваш код будет работать. Но поскольку вы извлекаете данные из асинхронного источника, вторая функция пытается использовать данные до того, как значение будет установлено.

  • 0
    Здравствуй. спасибо за Ваш ответ. Но я не совсем понимаю, что такое scope.getClientIdentityDocuments_a (scope.clientId) .then (function (document) {}); за?
  • 0
    Я превратил функцию getClientIdentityDocuments_a () в обещание, которое разрешается только после завершения асинхронного вызова, который обновляет переменную identityDocuments_a. Если вы сделаете что-нибудь с переменной до того, как асинхронный вызов вернет ее данные, переменная не изменится. Синтаксис .then() может использоваться с любым обещанием вместо синтаксиса обратного вызова, и он просто ожидает, пока обещание не будет разрешено (в данном случае defer.resolve() ), прежде чем оно выполнится.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню